栈与队列作为操作受限的线性表,在考试中常以选择题、填空题出现,也会有部分算法题目涉及对栈或队列的知识(如求解阶乘n!、括号匹配等场景)。
栈部分相对常考内容为进栈、出栈操作、栈空栈满判断共享栈两端进出栈的操作(考研);对于队列常以真假溢出判断、循环队列队空(队满)判断方向进行出题。
1.若进栈序列为a,b,c,则通过入出栈操作可能得到的a,b,c的不同排列个数为 A) 4 B) 5 C) 6 D) 7 【答案】B。注意对栈为先进后出,可能序列为abc、bac、cba、acb、bca,共计5种。 2.最不适合用作链式队列的链表是( )。 【答案】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. 设有一个递归算法如下:
则计算 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是一个空栈,实现将队列中的元素逆置的算法。 【注】所有题目的代码不唯一,如需参考答案可私信。 |