第09讲 队列 课堂互动 隐藏答案 | 返回首页

作者:欧新宇(Xinyu OU)

最后更新:2023-09-29


【课前自测09】

1.(单选)设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5,e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1,则栈S的容量至少应该是()。
A. 2
B. 3
C. 4
D. 5

答案及解析:B
队列的特性是先进先出,因此只需要考虑栈S的进出顺序,并根据其所占的空间大小就可以估计栈S的容量。按照出队顺序,可以得到栈的操作为e1进,e2进,e2出,e3进,e4进,e4出,e3出,e5进,e6进,e6出,e5出,e1出。由此课件,栈中最多的时候为3个元素,包括e1,e3,e4和e1,e5,e6两种情况。

‍2.(单选)栈和队列的不同点是( )。
A. 都是线性表
B. 都不是线性表
C. 栈只能在同一端进行插入删除操作,而队列在不同端进行插入删除操作
D. 没有不同点

答案及解析:C
栈和队列的不同点是,栈在同一端进行插入和删除操作,而队列在不同端进行插入和删除操作。

‍3.(单选)若某循环队列有队首指针front和队尾指针rear,在队不空时出队操作仅会改变( )。
A. front
B. rear
C. front 和 rear
D. 以上都不对

答案及解析:A
当循环队列不空时,出队操作只能改变队头指针front。

‍4.(单选)在循环队列中,元素的排列顺序( )。
A. 由元素进队的先后顺序确定
B. 与元素值的大小有关
C. 与队头和队尾指针的取值有关
D. 与队中数组大小有关

答案及解析:A
与标准队列相同,在循环队列中,元素的排列顺序也与元素进队的先后顺序有关。

5. 队列的先进先出特性是指( )。
A. 最后插入队列中的元素总是最后被删除
B. 当同时进行插入、删除操作时,总是插入操作优先
C. 每当有删除操作时,总要先做一次插入操作
D. 每次从队列中删除的总是最早插入的元素

答案及解析:AD
队列“先进先出”的特性表现在;先进队列的元素先出队列,后进队列的元素后出队列,进队列对应的是插入操作,出队列对应的是删除操作。A和D均正确。

【课堂互动9.1】队列的基本概念

‍1.(单选)栈和队列的共同点是()。
A. 都是先进先出
B. 都是线性结构
C. 具有相同存储结构
D. 没有共同点

答案及解析:B
选项A栈是先进后出;选项C两者都可以使用顺序存储和相同存储,但都不是唯一,因此无法比较;选项B正确,都是线性结构。

‍2.(单选)堆栈和队列的主要区别是()。
A. 限定元素插入和删除的位置不同
B. 逻辑结构不同
C. 存储结构不同
D. 名称不同

答案及解析:A

3.(单选)允许对队列进行的操作有()。
A.对队列中的元素排序
B.取出最近进队的元素
C.在队列元素之间插入元素
D.删除队头元素

4.(单选)【2021统考真题】初始为空的队列Q的一端仅能进行入队操作,另外一端既能进行入队操作又能进行出队操作。若Q的入队序列是1,2,3,4,5,则不能得到的出队序列是()。
A. 5,4,3,1,2
B. 5,3,1,2,4
C. 4,2,1,3,5
D. 4,1,3,2,5

答案及解析:D
假设队列的左端只允许入队,右端同时允许出队和入队。

5.(单选)【2010统考真题】某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作。若元素a,b,c,d,e依次入此队列后再进行出队操作,则不可能得到的出队序列是()。
A. b,a,c,d,e
B. d,b,a,c,e
C. d,b,c,a,e
D. e,c,b,a,d

答案及解析:C
该题考察的实际上是一个输出受限的双端队列。因此,我们只需要考察是否有满足选项中5个出队元素的入队序列即可。此时建议设定只能从右端进行出队(设定位只能左端出队方法类似,是需要将操作反向即可),此时我们可以将输出队列按照从右往左进行排列。例如,

【课堂互动9.2】循环队列

‍1.(单选)设循环队列Q中数组data的下标是0~n-1,其队头、队尾指针分别为f和r(f指向队首元素的前一位置,r指向队尾元素),元素x进队的操作是:

    _____()_____;
    Q.data[Q.rear] = x;

A. Q.rear++
B. Q.rear = (Q.rear + 1)%n
C. Q.front++;
D. Q.front = (Q.front + 1)%n

答案及解析:B
对于循环队列,进队操作仅移动队尾指针,元素x进队的操作是:Q.rear = (Q.rear + 1)%n; Q.data[Q.rear] = x。

‍2.(单选)若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为( )。
A. 1和5
B. 2和4
C. 4和2
D. 5和1

答案及解析:B
初始状态时,rear=0,当进队2个元素后,rear循环递增2,rear=2;front=3,出队一个元素后,front循环递增1,front=4。

‍3.(单选)设循环队列的存储空间为a[0,...,20],且当前队头指针(f指向队首元素的前一位置)和队尾指针(r指向队尾元素)的值分别为8和3,则该队列中元素个数为( )。
A. 5
B. 6
C. 16
D. 17

答案及解析:C
按照定义,队列的长度即元素个数 = (rear - front + MaxSize)%MaxSize = (3-8+21)%21 = 16。这种情况和front指向当前元素,rear指向队尾元素的下一个元素的计算是相同的。注意:数组A[n]的下标范围为0~n-1。如果写成A[0, n],则说明下标范围为0~n。

‍4.(单选) 【2011统考真题】已知循环队列存储在一维数组A[0,...,n-1]中,且队列非空时front和rear分别指向队头元素和队尾元素。若初始时队列空,且要求第一个进入队列的元素存储在A[0]处,则初始时front和rear的值分别是( )。
A. 0, 0
B. 0, n-1
C. n-1, 0
D. n-1, n-1

答案及解析:B
在循环队列中,插入操作只改变队尾指针,不改变队头指针。对于队头元素front来说,比较好理解,它指向队头,并且插入不改变其位置,因此它始终指向位置0。对于队尾元素rear来说,默认情况rear应该指向最后一个元素的后面,但是在本题中,第二句话直接说明“rear指向队尾元素”,因此只有一个元素时front=rear,不再是标准的front=rear+1。因此,当前入队为A[0]时,rear就会指向0;而如对前rear就会指向0的前面,也就是n-1。选项B正确。

5.(单选)最不适合用作链式队列的链表是()。
A. 只带队首指针的非循环双链表
B. 只带队首指针的循环双链表
C. 只带队尾指针的循环双链表
D. 只带队尾指针的循环单链表

答案及解析:A
由于非循环双链表只带队首指针,在执行入队操作时需要修改队尾结点的指针域,而查找队尾结点需要O(n)的时间。B、C和D均可在O(1)的时间内找到队首和队尾。

6.(单选)【2016统考真题】设有如下图所示的火车车轨,入口到出口之间有n条轨道,列车的行进方向均为从左至右,列车可驶入任意一条轨道。现有编号为1~9的9列列车,驶入的次序依次是8,4,2,5,3,9,1,6,7。若期望驶出的次序依次为1~9,则n至少是()。

A. 2
B. 3
C. 4
D. 5

答案及解析:C
根据题意,出队顺序为1-9,这意味着在每条轨道中,距离出口进的编号始终应比距离远的编号要更小。此时我们可以得到如下几个序列(一种),分别表示每个轨道存放的火车序号:98,654,732,1。事实上,只要保证先出队的不要被后出队的压住即可,所以入队顺序可以有多种选择。因此,此题,至少需要4条轨道。

【课堂互动9.3】链队列

1. 用单链表表示的链式队列的队头和队尾分别在链表的( )位置。
A. 链头和链尾
B. 链尾和链头
C. 链头和链中
D. 链尾和链中

答案及解析:A
在队列中,其元素的顺序是从队尾指向队头,这刚好与单链表的顺序一致。因此链头指向队头,链尾指向队尾。

2. ‎与顺序队相比,链队( )。
A. 优点是可以实现无限长队列
B. 优点是进队和出队时间性能更好
C. 缺点是不能进行顺序访问
D. 缺点是不能根据队首和队尾指针计算队的长度

答案及解析:D

3.(单选)最适合用作链队的链表是()。
A. 带队首指针和队尾指针的循环单链表
B. 带队首指针和队尾指针的非循环单链表
C. 只带队首指针的非循环单链表
D. 只带队首指针的循环单链表

答案及解析:B
由于队列需在双端进行操作,带队头和队尾指针的会更合适一些。因此,选项C和D的链表显然不太适合链队。选项A的链表在完成进队和出队后还要修改为循环的链表,对于队列来说是多余的操作。对于选项B,首指针便于删除首结点;尾指针便于在其后插入结点,是比较合理的方法,因此选项B正确。

4. 用链式存储方式的队列进行删除操作时需要()。
A. 仅修改头指针
B. 仅修改尾指针
C. 头尾指针都要修改
D. 头尾指针可能都要修改

答案及解析:D
队列用链式存储时,删除元素从表头删除,通常仅需修改头指针,但若队列中仅有一个元素,则尾指针也需要被修改,当仅有一个元素时,删除后队列为空,需修改尾指针为rear=front。

5.(单选)在一个链队列中,假设队头指针为front,队尾指针为rear,x所指向的元素需要入队,则需要执行的操作为()。
A. front = x, front = front->next
B. x->next = front->next, front = x
C. rear->next = x, rear = x
D. rear->next = x, x->next = NULL, rear = x

答案及解析:D
插入操作时,先将结点x插入到链表尾部,再让rear指向这个结点x。C的做法不够严密,因为是队尾,所以队尾x->next必须置为空。

6.(单选)假设循环单链表表示的队列长度为n,队头固定在链表尾,若只设头指针,则进队操作的时间复杂度为()。
A. O(n)
B. O(1)
C. O(n²)
D. O(nlog2n)

答案及解析:A
根据题意,进队操作是在队尾进行,即链表表头。而在本题中已明确说明链表只设头指针,也即没有头结点和尾指针。此时,新元素进入队列后,由于循环单链表需要将队头的元素反向指到新的元素上,因此,还需要先去寻找队头元素。而在只带头指针的循环单链表中寻找队头(链表的表尾)结点元素需要从队尾一致遍历到队头,也就是说需要O(n)的时间复杂度来寻队头。因此,进队的时间复杂度为O(n)。

【课堂互动9.4】栈和队列的应用

1. 栈的应用不包括( )。
A. 递归
B. 进制转换
C. 迷宫求解
D. 缓冲区

答案及解析:D
缓冲区是用队列实现的,ABC都是栈的典型应用。

2. 表达式 a*(b+c)-d 的后缀表达式是( )。
A. abcd*+-
B. abc+*d-
C. abc*+d-
D. -+*abcd

答案及解析:B
后缀表达式中,每个计算符号均直接位于其两个操作数的后面,按照这样的方式逐步根据计算的优先级将每个计算式进行变换,即可得到后缀表达式。
另解,将两个直接操作数用括号括起来,再将操作符提到括号后,最后去掉括号。


3. 下面( )用到了队列。
A. 括号匹配
B. 表达式求值
C. 页面替换算法
D. 递归

答案及解析:C
页面替换算法中的FIFO用到了队列,其余都是栈。

4. 利用栈求表达式的值,设立运算数栈OPEN。假设OPEN只有两个存储单元,则在下列表达式中,不会发出溢出的是( )。
A. A-B*(C-D)
B. (A-B)*C-D
C. (A-B*C)-D
D. (A-B)*(C-D)

答案及解析:B
利用栈求表达式的值时,可以分别设立运算符栈和运算数栈,其原理不变。选项B中A入栈、B入栈,计算R1,C入栈,计算R2,D入栈,计算R3,由此得栈深度为2。A、C、D依次计算得栈深为4、3、3。故选B

5. 【2014统考真题】假设栈初始为空,将中缀表达式 a/b+(c*d-e*f)/g 转换为等价后缀表达式的过程中,当扫描到f时,栈中的元素依次是( )。
A. +(*-
B. +(-*
C. /+(*-*
D. /+-*

答案及解析:B


6. 【2015统考真题】已知程序如下,程序运行时使用栈来保存调用过程的信息,自栈底到栈顶保存的信息依次对应的是( )。

int S(int n){
    return (n<=0)?0:S(n-1)+n;
}
void main(){
    cout << S(1);
}

A. main() -> S(1) -> S(0)
B. S(0) -> S(1) -> main()
C. main() -> S(0) -> S(1)
D. S(1) -> S(0) -> main()

答案及解析:A


【扩展练习09】

1. 通常设置循环队列Q的队空条件(front队首指针指向队首元素的前一位置,rear队尾指针指向队尾元素)是( )。
A. (Q.rear+1)%MaxSize == (Q.front+1)%MaxSize
B. (Q.rear+1)%MaxSize == Q.front+1
C. (Q.rear+1)%MaxSize == Q.front
D. Q.rear == Q.front

答案及解析:D
在循环队列中,通常设置队头等于队尾时表示队空。

2. ‏假设用一个不带头节点的单链表表示队列,队头在链表的( )位置。
A. 链头
B. 链尾
C. 链中
D. 以上都可以

答案及解析:A
在用单链表表示的链队时,以单链表的链头作为队头,以单链表的链尾作为队尾。

‍3.(单选)栈和队列具有相同的()。
A. 抽象数据类型
B. 逻辑结构
C. 存储结构
D. 运算

答案及解析:B
栈和队列的逻辑结构都是相同的,都属于线性结构,只是它们对数据运算不同。

4. (单选)栈和队列的主要区别在于()。
A. 它们的存储结构不一样
B. 它们的逻辑结构不一样
C. 所包含的元素不一样
D. 插入、删除操作的限定不一样

答案及解析:D
栈和队列的逻辑结构都是线性结构,都可以采用顺序存储或链式存储,C显然也错误。只有D才是栈和队列的本质区别,限定表中插入和删除操作位置的不同。

5.(单选)一个队列的入队顺序是1,2,3,4,则出队的输出顺序是()。
A. 4,3,2,1
B. 1,2,3,4
C. 1,4,3,2
D. 3,2,4,1

答案及解析:B
队列的入队顺序和出队顺序是一致的,这是和栈不同的。

‍6.(单选)[2019统考真题] 设栈S和队列Q的初始状态位空,元素abcdefg依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是bdcfeag,则栈S的容量是( )。
A. 1
B. 2
C. 3
D. 4

答案及解析:C
队列的特性是先进先出,因此只需要考虑栈S的进出顺序,并根据其所占的空间大小就可以估计栈S的容量。按照出队顺序,可以得到栈的操作为a进,b进,b出,c进,d进,d出,c出,e进,f进,f出,e出,a出,g进,g出。由此课件,栈中最多的时候为3个元素,包括a,c,d和a,e,f两种情况。

7.(单选)【2018统考真题】现有队列Q与栈S,初始时Q中的元素依次是1,2,3,4,5,6(1在队头),S为空。若仅允许下列3种操作:①出队并输出出队元素;②出队并将出队元入栈;③出栈并输出出栈元素,则不能得到的输出序列是()。
A. 1,2,5,6,4,3
B. 2,3,4,5,6,1
C. 3,4,5,6,1,2
D. 6,5,4,3,2,1

答案及解析:C
选项A的操作顺序为①①②②①①③③。选项B的操作顺序为②①①①①①③。选项D的操作顺序为②②②②②①③③③③③。对于选项C,首先输出的是3,说明1和2必须先依次入栈,而此后的出栈操作2肯定比1先输出,而选项中1比2先输出,这违背了栈的先入后出原则。

8.(单选)【2014统考真题】循环队列放在一维数组A[0,...,M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中,正确的是()。
A.队空:end1 == end2;队满: end1 == (end2+1)mod M
B.队空:end1 == end2; 队满:end2 == (end1+1)mod(M-1)
C.队空:end2 == (end1+1)mod M; 队满:end1 == (end2+1)mod M
D.队空:end1 == (end2+1)mod M;队满:end2 == (end1+1)mod(M-1)

答案及解析:A
end1指向队头元素,可知出队操作是先从A[end1]读数,然后end1再加1。end2指队尾元素的后一个位置,可知入队操作是先存数到A[end2],然后end2再加1。若用A[0]存储第一个元素,队列初始时,入队操作是先把数据放到A[0]中,然后end2自增,即可知end2初值为0;而end1指向的是队头元素,队头元素在数组A中的下标为0,所以得知end的初值也为0,可知队空条件为end1 == end2;然后考虑队列满时,因为队列最多能容纳M-个元素,假设队列存储在下标为0到M-2的M-1个区域,队头为A[0],队尾为A[M-2],此时队列满,考虑在这种情况下end1和end2的状态,end1指向队头元素,可知end1=0,end指向队尾元素的后一个位置,可知end2=M-2+1=M-1,所以队满的条件为end1==(end2+1)mod M.

9.(单选)在用单链表实现队列时,队头设在链表的()位置。
A. 链头
B. 链尾
C. 链中
D. 以上都可以

答案及解析:A
由于在队头做出队操作,为了便于删除队头元素,故总是选择链头作为队头。

10.(单选)若以1,2,3,4作为双端队列的输入序列,则既不能由输入受限的双端队列得到,又不能由输出受限的双端队列得到的输出序列是()。
A. 1,2,3,4
B. 4,1,3,2
C. 4,2,3,1
D. 4,2,1,3

答案及解析:C
本题考察队列的输出,只能依次进行计算。首先,我们应该明白受限双端队列是一种对标准队列的放松队列,即原来只能一端入队列,另外一端出队列的标准队列,现在变成了出队列可以在两端进行的输入受限双端队列和入队列可以在两端进行的输出受限双端队列。我们假设存在一个右端输入受限的双端队列,那么队列中的值就是4321(右边为队列的前端),此时进行出队的时候,可以两端交替进行。选项A可以通过四次右出实现;选项B通过左出、右出、左出、右出就可以实现。此时CD都无法实现。接下来,我们考察一个左端输出受限的双端队列。对于选项CD来说,4是先出的,那么它肯定位于队列的最右端,因此我们可以将其忽略,只考虑123的问题。我们按照123的入队顺序,在队列中,可能出现的情况只有321,312,213,其中213满足选项D的要求。而选项C的要求不在这个序列中,因此选项C是正确的。

11.(单选)循环队列存储在数组A[0,...,n]中,入队时的操作为()。
A. rear=rear+1
B. rear=(rear+1) mod (n-1)
C. rear=(rear+1) mod n
D. rear=(rear+1) mod (n+1)

答案及解析:D
数组下标范围0~n,因此数组容量为n+1。循环队列中元素入队的操作是rear=(rear+1)% maxsize。此题中MaxSize= n+1。因此入队操作应为rear=(rear+1) mod(n+1)。

12.(单选)若用数组A[0,...,5]来实现循环队列,且当前rear和front的值分别为1和5,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为()。
A. 3和4
B. 3和0
C. 5和0
D. 5和1

答案及解析:B
循环队列中,每删除一个元素,队首指针front = (front+1)%6,每插入一个元素,队尾指针rear=(rear+1)%6。上述操作后,front=0,rear=3。

13.(单选)假设一个循环队列Q[MaxSize]的队头指针为front,队尾指针为rear,队列的最大容量为MaxSize,此外,该队列再没有其他数据成员,则判断该队列已满的条件是()。
A. Q.front == Q.rear
B. Q.front+Q.rear>=MaxSize
C. Q.front == (Q.rear+1)%MaxSize
D. Q.rear == (Q.front+1)MaxSize

答案及解析:C
既然不能附加任何其他数据成员,只能采用牺牲一个存储单元的方法来区分是队空还是队满,约定以“队列头指针在队尾指针的下一位置作为队满的标志”,因此选C。选项A是判断队列是否空的条件,选项B和D都是干扰项。注意:考虑这类具体问题时,用一些特殊情况判断往往比直接思考问题能更快地得到答案,并可以画出简单的草图以方便解题。

14. 执行完下列语句段后,i的值为( )。

int f(int x){
    return ((x>0)? x*f(x-1):2);
}
int i;
i = f(f(1));

A. 2
B. 4
C. 8
D. 无限递归

答案及解析:B
栈与递归有着紧密的联系。递归模型包括递归出口和递归体两个部分。递归出口时递归算法的出口,即中止递归的条件。递归体是一个递推的关系式。根据题意:
f(0) = 2;
f(1)=1*f(0) = 2;
f(f(1)) = f(2) = 2*f(1) = 4;

15. 对于一个问题的递归算法求解和其相对应的非递归算法求解,( )。
A. 递归算法通常效率一些
B. 非递归算法通常效率高一些
C. 两者相同
D. 无法比较

答案及解析:B
通常情况下,递归算法在计算机实际执行的过程中包含很多重复计算,因此效率较低。而非递归算法则通常利用了计算机的缓存机制,将重复计算的结果保存在缓存中,从而避免了重复计算,因此效率较高。

16. 执行函数时,其局部变量一般采用( )进行存储。
A. 树形结构
B. 静态链表
C. 栈结构
D. 队列结构

答案及解析:C
调用函数时,系统会为调用者构造一个由参数表和返回地址组成的活动记录,并将记录压入系统提供的栈中,若被调用函数有局部遍历,也要压入栈中。

17. 执行( )操作时,需要使用队列作为辅助存储空间。
A. 查找散列(哈希)表
B. 广度有限搜索图
C. 前序(根)遍历二叉树
D. 深度优先搜索图

答案及解析:B


18. 下列说法正确的是( )。
A. 消除递归不一定需要使用栈
B. 对同一输入序列进行两组不同的合法入栈和出栈组合操作,所得的输出序列也一定相同
C. 通常使用队列来处理函数和过程调用
D. 队列和栈都是运算受限的线性表,只允许在表的两端进行运算

答案及解析:A


19. 【2009统考真题】为解决计算机主机与打印机之间速度不匹配问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中读取数据,该缓冲区的逻辑结构应该是( )。
A. 栈
B. 队列
C. 树
D. 图

答案及解析:B
打印提取数据必须保持原来数据的顺序,因此缓冲区的特性是先进先出。

20. 【2012统考真题】已知操作符包括 “+” “-” “*” “/” “(” “)”。将中缀表达式 a+b-a*((c+d)/e-f)+g 转换为等价的后主表达式 ab+acd+e/f-*-g+ 时,用栈来放暂时不能确定运算次序的操作符。栈初始时为空时,转换过程中同时保存在栈中的操作符的最大个数是( )。
A. 5
B. 7
C. 8
D. 11

答案及解析:A

第09讲 队列 课堂互动 隐藏答案 | 返回首页