《数据结构》-第三章 栈和队列(习题)

第三章 栈和队列练习题

      栈与队列作为操作受限的线性表,在考试中常以选择题、填空题出现,也会有部分算法题目涉及对栈或队列的知识(如求解阶乘n!、括号匹配等场景)。

     栈部分相对常考内容为进栈、出栈操作、栈空栈满判断共享栈两端进出栈的操作(考研);对于队列常以真假溢出判断、循环队列队空(队满)判断方向进行出题。


一、选择题(第1-10题为基础难度,第11-20题难度适合考研)

1.若进栈序列为a,b,c,则通过入出栈操作可能得到的a,b,c的不同排列个数为       

A) 4         B) 5         C) 6         D) 7

【答案】B。注意对栈为先进后出,可能序列为abc、bac、cba、acb、bca,共计5种。

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

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

3. 栈S最多能容纳4个元素。现在6个元素按A、B、C、D、E、F的顺序进栈,下列哪一个序列是不可能的出栈序列?

A) A、B、C、D、E、F            B) A、F、E、D 、C、B

C) C、B、E、D、A、F            D) C、D、B、F、 E、 A

【答案】B。选项A,A进栈后出栈、B进栈后出栈、C进栈后出栈、D进栈后出栈、E进栈后出栈、F进栈后出栈,栈只使用了一个容量并可得到A选项所对应的结果。

选项B,A进栈后出栈、B进栈、C进栈、D进栈、E进栈此时栈S满,F无法进栈,因此不可能出现该序列

选项C,A进栈、B进栈、C进栈后出栈、B出栈、D进栈、E进栈后出栈、D出栈、A出栈、F进栈后出栈,得到C选项所对应的结果,并且栈所占最大容量为3符合题目要求。

选项D,A进栈、B进栈、C进栈后出栈、D进栈后出栈、B出栈、E进栈、F进栈后出栈、E出栈、A出栈,得到D选项所对应的结果且栈所占最大容量为3符合题目要求。

4. 循环队列存储在数组A[0..m]中,则入队时的操作为(    )。

   A. rear=rear+1                   B. rear=(rear+1) mod (m-1)

  C. rear=(rear+1) mod m       D. rear=(rear+1) mod (m+1)

【答案】D。注意数组A[0..m]共存储(m+1)个元素。

5. 若已知一个栈的入栈序列是1, 2, 3, …, n,其输出序列为p1, p2,p3,…,pn,

若p1=n,则pi为 (      )

   A.i       B.n=i      C.n-i+1       D.不确定

【答案】C。此题可使用特殊值法进行计算,如入栈序列为1, 2, 3, 4, 5, 6,7,8,其输出序列为p1, p2,p3,…,pn,则p1=8,p2=7,p3=6,p4=5,p5=4….按照此规律可得下标i与n的关系。

6. 设有一个递归算法如下:

int fact(int n) { //n大于等于 0

   if(n<=0)    return 1;

   else      return n*fact(n-1);

 }

则计算 fact(n) 需要调用该函数的次数为( )。

 A.n+1        B. n-1      C. n          D. n+2

【答案】A。此题也适用特殊值法。设 n=0,易知仅调用一次 fact(n) 函数,故选 A 。

7. 为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机 将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是( )。

 A.队列      B .栈      C.线性表      D.有序

【答案】A。本题为关于队列应用的经典题目,解决缓冲区问题应利用一种先进先出的线性表,而队列正是一种先进先出的线性表。而递归调用、函数调用、表达式求值均用到了栈的后进先出性质。

8. 用链接方式存储的队列,在进行删除运算时( )。

 A. 仅修改头指针                B. 仅修改尾指针

 C. 头、尾指针都要修改     D. 头、尾指针可能都要修改

【答案】D。一般情况下只修改头指针,但是,当删除的是队列中最后一个元素时,队尾指针也会丢失,因此需对队尾指针重新赋值。

9. 最大容量为 n 的循环队列, 队尾指针是 rear ,队头是 front ,则队空的条件是 ( )。

   A. (rear+1)%n==front             B. rear==front

   C. rear+1==front                    D. (rear-1)%n==front

【答案】B。注意区分队空、队满判断条件。

10. 栈和队列具有相同的( ).

A.抽象数据类型         B.逻辑结构       C.存储结构                D.运算

【答案】B。栈和队列的逻辑结构都是相同的,都属于线性结构,只是它们对数据的运算不同。因此其抽象数据类型也不相同。

11. 设链表不带头结点且所有操作均在表头进行,则下列最不适合作为链栈的是( )。

A.只有表头结点指针,没有表尾指针的双向循环链表

B.只有表尾结点指针,没有表头指针的双向循环链表

C.只有表头结点指针,没有表尾指针的单向循环链表

D.只有表尾结点指针,没有表头指针的单向循环链表

【答案】C。对于双向循环链表,不管是表头指针还是表尾指针,都可以很方便地找到表头结点,方便在表头做插入或删除操作。而单循环链表通过尾指针可以很方便地找到表头结点,但通过头指针找尾结点则需要遍历一次链表。对于C,插入和删除结点后,找尾结点需要花费0(n)的时间。

12. 一个栈的输入序列为1,2,3..*,n, 输出序列的第一个元素是i,则第j个输出元素是( )。

    A. i-j- 1               B. i-j           C. j-i+ 1              D.不确定

【答案】D。注意题目信息,不要与第5题混淆。当第i个元素第一个出栈时,则i之前的元素可以依次排在i之后出栈,但剩余的元素可以在此时进栈并且也会排在i之前的元素出栈,所以第j个出栈的元素是不确定的。

13. 若一个栈的输入序列是P1,P2.*.,Pn输出序列是1,2,3,.,n,若P3=1,则P1的值( ).

    A. .可能是2        B.一定是2      C.不可能是2      D.不可能是3

【答案】C.入栈序列是P1,P2.*.,Pn。由于P3=1,即PI, P2, P.连续入栈后,第一个出栈元素是P3,说明P1,P2已经按序进栈,根据先进后出的特点可知,P2必定在P1之前出栈,而第二个出栈元素是2,而此时P1不是栈项元素,因此P1的值不可能是2。

14. 若已知一个栈的入栈序列是1, 2,3,4,其出栈序列为P,P2,P3,P4,则P2, P4不可能是( )。

   A.2,4       B. 2,1      C.4,3       D.3,4

【答案】C。逐个判断每个选项可能的入栈出栈顺序。对于A选项,可能的顺序是1入,1出,2入,2出,3入,3出,4入,4出。对于B选项,可能的顺序是1入,2入,3入,3出,2出,4入, 4出,1出。对于D选项,可能的顺序是1入,1出,2入,3入,3出,2出,4入,4出。而C没有对应的序列。

15. 设栈的初始状态为空,当字符序列“n1_ ”作为栈的输入时,输出长度为3,且可用做

C语言标识符的序列有()个。

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

【答案】C。首先,栈的顺序是先进后出

字符序列为n3_   1)n入栈,再出栈,然后3入栈,再出栈,—入栈,再出栈   序列是n3_

                           2)n入栈,再出栈,然后3,—入栈,再出栈,序列是n_3

                           3)n入栈,3入栈,再出栈,n出栈, —入栈,再出栈   序列是3n_

                           4) n入栈,3入栈,再出栈, —入栈,序列是3_n

                           5) n入栈,3入栈,_入栈,序列是_3n

其次,C语言的标识符不能以数字开头,去除3n_和3_n   答案为3

16. 采用共享栈的好处是( )。

A.减少存取时间,降低发生上溢的可能    B.节省存储空间,降低发生上溢的可能

C.减少存取时间,降低发生下溢的可能    D.节省存储空间,降低发生下溢的可能.

【答案】B. 存取栈中的元素都只需要0(1)的时间,所以减少存取时间无从谈起,排除A、C。另外,栈的插入和删除操作都是在栈顶进行的,只可能发生上溢(栈顶指针超出了最大范围),而下溢是指当缓冲器空,还往外读。因此本题答案为B。

17. 已知循环队列的存储空间为数组A[21],front 指向队头元案的前一一个位置,rear 指

向队尾元素,假设当前front和rear的值分别为8和3,则该队列的长度为( ).

   A.5    B. 6      C.16     D.17

【答案】C。队列的长度为(rear-front +maxsize) *maxsi ze= (rear-front+21) *21=16.这种情况和front指向当前元素,rear 指向队尾元素的下一个元素的计算是相同的。

18. 若用数组A0..]来实现循环队列,且当前rear和front的值分别为1和5,当从队

列中删除-个元素,再加入两个元素后,rear 和front的值分别为( ).

   A.3和4    B.3和0    C.5和0    D.5和1

【答案】B。循环队列中,每删除一个元素,队首指针front= (front+1)86,每插入一个元素,队尾指针rear= (rear+1)号6。上述操作后,front=0, rear=3.

19.设有如下图所示的火车车轨,入口到出口之间有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,则需先入队元素小于后入队元素

20. 利用栈求表达式的值时,设立运算数栈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.

二、填空题

1. 链栈(不带头结点)执行Pop操作,并将出栈的元素存在x中,应该执行                         

【答案】x=top ->data; top=top- >next

2. 向一个栈顶指针为top的链栈(不带头结点)中插入一个x结点,则执行                         

【答案】x->next=top; top=x

三、操作题

1.有5个元素,其入栈次序为A,B,C,D,E, 在各种可能的出栈次序中,第一个出栈元素为

C且第二个出栈元素为D的出栈序列有哪几个?

2.若元素的进栈序列为A,B,C,D,E,运用栈操作,能否得到出栈序列B,C,A,E,D和D, B,

A,C,E?为什么?

3. 例设有一个双端队列,输入序列为1, 2,3, 4,试分别求出以下条件的输出序列。

(1)能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列。

(2)能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列。

(3)既不能由输入受限的双端队列得到,又不能由输出受限的双端队列得到的输出序列。

【注】如需参考答案可私信。

四、算法题

1. 利用一个栈实现以下递归函数的非递归计算:

2. Q是一个队列,S是一个空栈,实现将队列中的元素逆置的算法。

【注】所有题目的代码不唯一,如需参考答案可私信。

  • 25
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值