Bootstrap

数据结构复试面试

什么是队列的上溢现象?一般有几种解决方法

队列的“上溢”:队列空间已满,而继续往队列中插入元素,就会使数组越界而导致程序代码被破坏,称为“上溢”。

解决方法:1、用动态数组来存放队列元素,当元素个数达到数组上限时,再申请一个更大的数组空间即可.2、用链表来存放队列元素. 

对于队列,还有一种“假溢出”现象,队列中尚余有足够的空间,但元素却不能入队,一般是由于队列的存储结构或操作方式的选择不当所致,可以用循环队列解决。

堆栈的上溢与下溢

由于堆栈区域是在堆栈定义时就确定了的,因而堆栈工作过程中有可能产生溢出。堆栈溢出有两种情况可能发生:如堆栈已满,但还想再存入信息,这种情况称为堆栈上溢;另一种情况是,如堆栈已空,但还想再取出信息,这种情况称为堆栈下溢。不论上溢或下溢,都是不允许的。因此在编制程序时,如果可能发生堆栈溢出,则应在程序中采取保护措施。这可以通过给SP规定上、下限,在进栈或出栈操作前先做SP和边界值的比较,如溢出则作溢出处理,以避免破坏其他存储区或使程序出错的情况发生。

数据结构在学什么?

如何用程序代码把现实世界的问题信息化

如何用计算机高效地处理这些信息从而创造价值

时间复杂度大O是什么意识?

大O是我们在分析算法复杂度时最常用的一种表示法。

f(x) = O(g(x)) 表示的含义是f(x)以g(x)为上界

当函数的大小只有上界,没有明确下界的时候,则可以使用大O表示法,该渐进描述符一般用于描述算法的 最坏复杂度

当你为解决某一问题而选择数据结构时,应从哪些方面考虑?

主要考虑两点:时间和空间 。

所谓“时间”就是一个算法从开始到执行完毕所需要的用时。如果某个问题对于时间要求很高(需要尽快完成)。那么“时间”是要优先考虑的。

“空间”是指执行完一个算法所需要消耗的内存大小。

数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据类型的数据对象,而且要描述数据对象各元素之间的相互关系。

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

迪杰斯特拉斯算法和弗洛伊德算法找任意一对顶点的最短路径的时间复杂度,它们的时间复杂度相等吗?

迪杰斯特拉算法是求单源最短路径,即一个源点到其他任意源点的最短路及,时间复杂度为O(N^2)   若采用迪杰斯特拉算法找任意一对顶点最短路径,则需要的时间复杂度为O(N^3)

弗洛伊德算法是求各顶点之间的最短路径问题 时间复杂度为O(N^3)

数据结构和数据类型的区别

数据结构相互之间存在一种或多种特定关系的数据元素的集合,是计算机存储和数据组织的方式,它分为三个方面,即数据的逻辑结构,数据的物理结构,数据的操作,数据结构强调结构,即元素间的关系;

数据类型一个值的集合以及定义在这个值集上的一组操作的总称,可分为原子类型和结构类型,数据类型强调类型,即作用于元素合法操作

那么递归使用的栈是什么样的一个栈呢?

首先,看一下系统栈和用户栈的用途。

系统栈(也叫核心栈、内核栈)是内存中属于操作系统空间的一块区域,其主要用途为: (1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出; (2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

我们编写的递归程序属于用户程序,因此使用的是用户栈。

简述数据结构的三要素

逻辑结构:从逻辑上描述数据,即数据之间的逻辑关系。(线性结构和非线性结构)

物理结构:数据在计算机内的存储方式(顺序存储,链式存储,索引存储,散列存储)

数据的运算:数据的运算包括数据的定义与实现,运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。

简述算法的特性?

(1)有穷性:一个算法必须在执行有穷步后结束。

(2)确定性:算法中的每条指令必须由确切的含义,不能有二义性。

(3)可行性:算法中描述的操作能够通过有限次的基本运算来实现。

(4)输入:一个算法必须有0个或者有限个输入。

(5)输出:一个算法必须有1个或者有限个输出。

一个好的算法应该保证:

正确性(算法能够正确的解决问题),可读性(易于人们理解),健壮性(输入非法数据时算法能够进行处理,不会出现莫名其妙的结果)。

贪心算法和动态规划以及分治法的区别?

贪心算法顾名思义就是做出在当前看来是最好的结果,它不从整体上加以考虑,也就是局部最解。贪心算法从上往下,从顶部一步一步最优,得到最后的结果,它不能保证全局最优解,与贪心策略的选择有关。(哈夫曼数,首先选择权值小的,这样保证权值大的离根近)(PrimDijkstra

动态规划是把问题分解成子问题,这些子问题可能有重复,可以记录下前面子问题的结果防止重复计算。动态规划解决子问题,前一个子问题的解对后一个子问题产生一定的影响。在求解子问题的过程中保留哪些有可能得到最优的局部解,丢弃其他局部解,直到解决最后一个问题时也就是初始问题的解。动态规划是从下到上,一步一步找到全局最优解。(各子问题重叠)(0-1背包问题

分治法(divide-and-conquer:将原问题划分成n个规模较小而结构与原问题相似的子问题; 递归地解决这些子问题,然后再合并其结果,就得到原问题的解。(各子问题独立
分治模式在每一层递归上都有三个步骤:
分解(Divide):将原问题分解成一系列子问题;
解决(conquer
):递归地解各个子问题。若子问题足够小,则直接求解;
合并(Combine
):将子问题的结果合并成原问题的解。
例如归并排序

用循环比递归的效率高吗?

循环和递归两者是可以互换的,不能决定性的说循环的效率比递归高。

如果用到递归的地方可以很方便使用循环替换,而不影响程序的阅读,那么替换成递归往往是好的。(例如:求阶乘的递归实现与循环实现。)

递归的优点是:代码简洁清晰,容易检查正确性;缺点是:当递归调用的次数较多时,要增加额外的堆栈处理,有可能产生堆栈溢出的情况,对执行效率有一定的影响。

循环的优点是:结构简单,速度快;缺点是:它并不能解决全部问题,有的问题适合于用递归来解决不适合用循环。

红黑树是什么?

红黑树的性质
    ① 每个结点非红即黑
    ② 根结点是黑的
    ③ 每个叶结点都是黑的
    ④ 如果一个结点是红的,则它的子节点必须是黑的
    ⑤ 对于任意节点而言,其到叶结点的每条路径都包含相同数目的黑节点

红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或者BLACK。通过对任何一条从根到叶子的路径上各个着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。

当二叉查找树的高度较低时,这些操作执行的比较快,但是当树的高度较高时,这些操作的性能可能不比用链表好。红黑树(red-black tree)是一种平衡的二叉查找树,它能保证在最坏情况下,基本的动态操作集合运行时间为O(lgn)。

红黑树的应用场景:红黑树是一种不是非常严格的平衡二叉树,没有AVLtree那么严格的平衡要求,所以它的平均查找,增添删除效率都还不错。广泛用在C++的STL中。如map和set都是用红黑树实现的。

了解并查集吗?什么是合并查找问题呢?

顾名思义,就是既有合并又有查找操作的问题

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。

并查集也是使用树形结构实现。不过,不是二叉树。每个元素对应一个节点,每个组对应一棵树。在并查集中,哪个节点是哪个节点的父亲以及树的形状等信息无需多加关注,整体组成一个树形结构才是重要的。类似森林

说一下拓扑排序

一个大工程往往被分为许多小的子工程,并且这些子工程之间存在先后关系,比如A工程必须结束才能开始B工程,这就是反映了各个子工程之间的先后关系,可以用一个有向图来表示,图中的顶点达标活动,有向边代表先后关系,把这种图称为顶点活动网(AOV网),在这种网中,如果不存在回路,那由这种网构造拓扑序列的过程成为拓扑排序(把所有活动排成一个线性序列)

如何判断一个链表中有环

设置两个指针p,q都指向头结点,p一次移动一步,q一次移动两步,如果经过n次之后,p与q同时指向同一个节点,那么就存在环

什么是逆波兰式?求值的思想是什么?

逆波兰式就后缀表达式,从左往右依次读取,如果是操作数就入栈,如果遇到操作符,就把栈中的两个操作数出栈,然后做运算,再将结果入栈,接着读取,重复这个步骤

头指针和头结点的区别?

头指针:是指向第一个节点存储位置的指针,具有标识作用,头指针是链表的必要元素,无论链表是否为空,头指针都存在。

头结点:是放在第一个元素节点之前便于在第一个元素节点之前进行插入和删除的操作,头结点不是链表的必须元素,可有可无,头结点的数据域也可以不存储任何信息。

双向链表:即在单链表的每个节点上添加一个指向其前驱结点的指针域,双向链表中每个节点都有两个指针域,分别指向其直接前驱和直接后继,用空间换取了时间上的性能优化

顺序表与链表的比较

(1)存取方式:顺序表可以顺序存取,随机存取,链表是能顺序存取。

(2)逻辑结构和物理结构上:顺序存储是逻辑上相邻的元素物理上也相邻,链式存储是逻辑上相邻的元素物理上不一定相邻。

(3)插入删除操作:顺序表插入删除操作平均需要移动半个表长的元素,链表只需要修改相应的指针即可。

(4)空间分配:顺序存储在静态存储分配下需要预先分配足够大的空间,动态存储分配虽然可以扩充空间,但是需要移动大量的元素;链式存储空间在需要时申请即可。

比较顺序存储和链式存储的优缺点

(1)顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一),要求内存中可用存储单元的地址必须是连续的。

  优点:① 存储密度大(=1),存储空间利用率高;

     ② 可随机存取表中的任一元素,查找元素方便。

  缺点:① 插入或删除元素时不方便,须移动大量元素,效率较低;

     ② 存在预分配空间问题。

(2)链式存储时,相邻数据元素可随意存放,但所占存储空间分为两个部分,一部分存放结点值,另一部分存放表示结点间关系的指针。

  优点:① 插入或删除元素时很方便,使用灵活;

     ② 支持动态分配空间。

  缺点:① 存储密度小(<1),存储空间利用率低;

     ② 查找元素不方便。

共享栈是什么?

利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底设在共享空间的两端,两个栈顶向共享空间的中间延伸,这样能够更有效的利用存储空间。

对比栈和队列数据结构的特点,并举例它们的典型应用

相同点:
栈和队列都是线性结构
是两种特殊的线性表即
受限的线性表,都对插入和删除操作加以限制;
栈和队列都可以通过顺序结构和链式结构实现。

不同点:
栈只允许在一端进行插入和删除,因而是后进先出表;
队列只允许在一端进行插入,另一端进行删除,因而是
先进先出表。

典型应用

常见栈的应用场景包
括号问题的求解
表达式的转换和求值,
函数调用和递归实现,
深度优先搜索遍历等;

常见队列的应用场景包括
计算机系统中各种资源的管理,
消息缓冲器的管理
广度优先搜索遍历等。

什么是栈溢出,并举个导致栈溢出的简单例子

栈溢出指的是程序向栈中某个变量写入的字节数超过了这个变量本身所申请的字节数,因而导致栈中与其相邻的变量的值被改变。

栈溢出的原因:

  ① 递归调用的层次太多。递归函数在运行时会执行压栈操作,压栈次数太多也会导致栈溢出。

  ② 指针或数组越界。例如进行字符串拷贝,处理用户输入等

堆和栈的区别,以及为什么栈要快

(1)堆和栈的区别

  ① 扩展方向不同
                 堆是由低地址高地址扩展;
                 栈是由
高地址低地址扩展。

  ② 申请方式不同:
                 堆
程序员手动分配和管理;
                 栈系统自动分配和管理;

  ③ 效率不同
                堆由程序员分配,分配效率较低,可能由于操作不当产生内存碎片
                
由系统分配,分配效率较高不会有内存碎片

  ④ 程序局部变量使用的是栈空间new和malloc函数动态申请的内存是堆空间

(2)栈的效率高的原因

  栈是操作系统提供的数据结构,计算机底层对栈提供了一系列支持:分配专门的存储器存储栈的地址,压栈和入栈有专门的指令执行;

  而堆是由C和C++函数库提供的,机制复杂需要一系列分配内存、合并内存和释放内存的算法,因此效率较低。

请简述KMP算法

在一个字符串中查找是否包含目标匹配字符串

其主要思想是每趟比较过程让子串先后滑动一个合适的位置。

当发生不匹配的情况时,不是右移一位,而是移动(当前匹配的长度 - 当前匹配子串的部分匹配值)位。

线索二叉树

将二叉链表中的空指针改成指向前驱节点或后继的线索

线索链表解决了无法直接找到该结点在某种遍历序列中的前驱和后继结点的问题,解决了二叉链表找左、右孩子困难的问题。

树的存储结构

双亲表示法:采用一组连续的存储空间存储每个结点,同时在每个结点后面增设一个伪指针指向其双亲节点。

孩子表示法:将每个结点的孩子结点用单链表链接起来形成一个线性结构。

孩子兄弟表示法:以二叉链表作为树的存储结构,其左指针指向第一个孩子结点,右指针指向其相邻的兄弟结点。可以方便地实现树转换为二叉树的操作,易于查 找结点的孩子等,但缺点是从当前结点查找其双亲结点比较麻烦。

哈夫曼树

:树中的结点往往被赋予一个有意义的数值称为该结点的权。
结点的带权路径长度:从树的根到任意节点的路径长度与该结点的权值之积称为该结点的带权路径长度。
树的带权路径长度:树中所有叶结点的带权路径之和为该树的带权路径长度。
哈夫曼树:带权路径长度最小的树为哈夫曼树。

B树和B+树的区别,以一个m阶树为例。

关键字的数量不同

B+树叶子结点有m个,有m个关键字

B树叶子结点有m个,m-1个关键字

存储的位置不同

B+树中的数据都存储在叶子结点上,也就是其所有叶子结点的数据组合起来就是完整的数据,

B树数据存储在每一个结点中,并不仅仅存储在叶子结点上。

分支结点的构造不同

B+树分支结点其关键字只是起到了一个索引的作用

B树分支结点存储数据信息

查询不同:

B树在找到具体的数值以后,则结束

B+树则需要通过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程中走了一条从根结点到叶子结点的路径。

邻接矩阵与邻接表的区别?

邻接矩阵表示

无向图的邻接矩阵是对称的,矩阵的行或列的有效元素的个数之和是节点的度。

有向图的邻接矩阵不一定对称,矩阵中行的有效元素的个数之和是节点的出度,列的有效元素的个数之和是节点的入度。

优点是可以很方便知道两个节点之间是否存在边,以及快速的添加或删除边

缺点是如果邻接矩阵中节点个数比较少容易造成存储空间的浪费

邻接表表示:

无向图的每条在邻接表中存储两次,若想知道节点的度,只需要求出对应链表中节点的个数即可。有向图的边在邻接表中仅存储一次,若想知道节点的出度,则需要遍历对应的链表,若要求节点的入度则还需要遍历其他的链表。

优点节省空间,只给实际存在的边分配存储空间;

缺点是在涉及度时可能需要遍历整个链表。

普里姆算法

从图中任一顶点出发,构成一棵树,然后从与这棵树相邻的边中选择最小的边,并将这条边和所连接的顶点并入树中,在选择与该树相邻的最小边且不构成回路,将边和顶点并入,重复上述过程,直到所有顶点均已并入树中。

克鲁斯卡尔算法

假设图中每个顶点自成一个连通分量,按照图中边的权值由小到大的顺序,不断选取未被选取过且权值最小的边,若边的两个顶点在不同的连通分量上,就将该边及其顶点并入生成树中,如此重复,直到所有顶点均已并入

迪杰斯特拉算法

设有两个顶点集S和T,S中存放当前已经找到最短路径的顶点,T中存放图中剩余顶点,开始时S中只有源点,然后不断地从集合T中选取到源点的路径长度最短的顶点并入集合S中,集合S每并入一个顶点就要修改源点到集合T中顶点的最短路径长度值,不断重复上述过程,直到集合T中顶点全部并入S。

AOV网与AOE网的区别:

AOV网和AOE网都是有向无环图,区别在于它们的顶点和边所代表的含义是不同的,AOE网中的边有权值AOV网边无权值,仅代表活动之间的关系。

关键路径:从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径,在这条路径上活动称为关键活动,完成整个工程的最短时间就是关键路径的长度。

什么是排序的稳定性,稳定的排序方法有哪些

排序的稳定性是指当待排序序列中有两个或两个以上相同的关键字时,排序前和排序后这些关键字的相对位置,如果没有发生变化就是稳定的,否则就是不稳定的。
稳定的排序方法有直接插入排序冒泡排序归并排序和基数排序。

解决哈希冲突的方法

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构

1) 线性探测法

2) 平方探测法

3) 伪随机序列法

4) 链地址法(拉链法)

对各种查找方法的概括

(1)顺序查找:把待查关键字key放入哨兵位置(i=0),再从后往前依次把表中元素和key比较,如果返回值为0则查找失败,表中没有这个key值,如果返回值为元素的位置i(i!=0)则查找成功,设置哨兵的位置是为了加快执行速度。他的时间效率为O(n)
(2)折半查找:要求查找表为顺序存储结构并且有序,若关键字在表中则返回关键字的位置,若关键字不在表中时则查找左右子部分,停止查找的典型标志是:查找范围的上界 <= 查找范围的下界
(3)二叉排序树:或者是一棵空树,或者是一棵具有如下特点的树:如果该树有左子树,则其左子树的所有节点值小于根的值;若该树有右子树,则其右子树的所有节点值均大于根的值;其左右子树也分别为二叉排序树。
(4)平衡二叉树:它或者是一棵空树或者具有如下特点:他的左子树和右子树的高度差的绝对值不能大于1,且他的左右子树也都是平衡二叉树。 如果再一个平衡二叉树中插入一个节点可能造成失衡,这时就要进行树结构的调整,即平衡旋转。包括4中情况:在左子树的左子树上插入节点时向右进行单向旋转;在右子树的右子树上插入节点时向左进行单向旋转;在左子树的右子树插入节点时先向左旋转再向右旋转;在右子树的左子树插入节点时先向右旋转再向左旋转。

对各种内部排序的概括与总结?

 排序是指把一个任意元素的序列排列成一个按关键字key有序的序列

内部排序包括:插入排序、选择排序、交换排序、归并排序、基数排序。

插入排序包括:直接插入排序、折半插入排序、希尔排序;

选择排序包括:简单选择排序,堆排序;

交换排序包括:冒泡排序、快速排序。

(1)直接插入排序稳定):基本思想为:将序列分为有序部分和无序部分,从无序部分依次选择元素与有序部分比较找到合适的位置,将原来的元素往后移,将元素插入到相应位置上。时间复杂度为:O(n^2),空间复杂度为O(1)

(2)折半插入排序稳定):基本思想为:设置三个变量low high mid,令mid=(low+high)/2,若a[mid]>key,则令high=mid-1,否则令low=mid+1,直到low>high时停止循环,对序列中的每个元素做以上处理,找到合适位置将其他元素后移进行插入。他的比较次数为O(nlog2n),但是因为要后移,因此时间复杂度为O(n^2),空间复杂度为O(1)。 优点是:比较次数大大减少。

(3)希尔排序不稳定):基本思想为:先将序列分为若干个子序列,对各子序列进行直接插入排序,等到序列基本有序时再对整个序列进行一次直接插入排序。优点是:让关键字值小的元素能够很快移动到前面,且序列基本有序时进行直接插入排序时间效率会提升很多,空间复杂度为O(1)。

(4)简单选择排序不稳定):基本思想为:将序列分为2部分,每经过一趟就在无序部分找到一个最小值然后与无序部分的第一个元素交换位置。优点是:实现起来特别简单,缺点是:每一趟只能确定一个元素的位置,时间效率低。时间复杂度为O(n^2),空间复杂度为O(1)

(5)堆排序不稳定):设有一个任意序列,k1,k2,...,kn,当满足下面特点时称之为堆:让此序列排列成完全二叉树,该树具有以下特点,该树中任意节点均大于或小于其左右孩子,此树的根节点为最大值或者最小值。优点是:对大文件效率明显提高,但对小文件效率不明显。时间复杂度为O(nlog2n),空间复杂度为O(1)。

 (6)冒泡排序稳定):基本思路为:每一趟都将元素进行两两比较,并且按照“前小后大”的规则进行交换。优点是:每一趟不仅能找到一个最大的元素放到序列后面,而且还把其他元素理顺,如果下一趟排序没有发生交换则可以提前结束排序。时间复杂度为O(n^2),空间复杂度为O(1)

(7)快速排序不稳定):基本思路为:在序列中任意选择一个元素作为中心,比它大的元素一律向后移动,比它小的元素一律向前移动,形成左右两个子序列,再把子序列按上述操作进行调整,直到所有的子序列中都只有一个元素时序列即为有序。优点是:每一趟不仅能确定一个元素,时间效率较高。时间复杂度为O(nlog2n),空间复杂度为O(log2n).

(8)归并排序(稳定):基本思想为:把两个或者两个以上的有序表合并成一个新的有序表。时间复杂度为O(nlogn),空间复杂度和待排序的元素个数相同。

(9)基数排序(稳定):时间复杂度为:对于n个记录进行链式基数排序的时间复杂度为O(d(n+rd)),其中每一趟分配的时间复杂度为O(n),回收的时间复杂度为O(rd)。

提高外部排序算法的效率

由于待排文件无法全部放入内存,所以排序期间必须要频繁的进行内外存之间数据的交换,这会耗费大量的时间。所以可以通过增加归并路数来减少归并趟数,进而减少I/O次数。

而增加归并路数又会增加内部排序的时间,所以引入了败者树

增加初始归并段个数,并且不受内存空间的限制,引入了置换-选择算法

文件经过置换-选择算法之后得到的是长度不同的初始归并段,如何组织长度不等的出使归并段的归并顺序,使得I/O次数最少,就引入了最佳归并树

败者树(大的为失败者,小的为胜利者)

可视为一棵完全二叉树,每个叶结点存放各归并段在归并过程中参加比较的记录,非叶结点用来记录左右子树中的“失败者”,胜利者继续向上比较直到根节点。输出最后的胜利者。

最佳归并树

对于K路归并算法,可用构造K叉哈夫曼树的方法来构造最佳归并树。





线性结构和非线性结构的区别

(1)线性结构:除第一个元素和最后一个元素外,每个数据元素都有唯一的前驱和唯一的后继,第一个元素没有前驱,最后一个元素没有后继,关系是一对
(2)非线性结构:表示结点间关系的前驱后继不具有唯一性,结点间是一对多多对多的关系。

线性结构的数据结构有哪些?

线性的数据结构有:线性表、栈、队列、双端队列、数组和串

线性表:线性表是最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列。特点是线性表中数据元素之间的关系是一对一的关系;线性表的逻辑结构简单,便于实现和操作

栈:栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。栈是限定仅在表头进行插入和删除操作的线性表。特点是允许在同一端进行插入和删除操作的特殊线性表,栈可以用来在函数调用的时候存储断点,做递归时要用到栈。

队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。在队列的形成过程中,可以利用线性链表的原理,来生成一个队列;队列和栈一样只允许在断点处插入和删除元素。

双端队列:双端队列是指允许两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍是线性结构。将队列的两端分别称为前端和后端,两端都可以入队和出队。对于双端队列,在序列的两端插入元素的时间复杂度均为常数,在中间插入元素的时间复杂度与插入点到最近序列端点的距离成正比。

数组:数组是用于储存多个相同类型数据的集合。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起;数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。

串:串是零个或多个字符组成的有限序列。串中所包含的字符个数为该串的长度;长度为零的串称为空串,它不包含任何字符。

;