数据结构期末复习第三章栈和队列
第三章:栈和队列
栈的特性:后进先出(LIFO)
1. 输入序列为ABC,可以变为CBA时,经过的栈操作为( B )
A. push, pop, push, pop, push, pop
B. push, push, push, pop, pop, pop
C. push, push, pop, pop, push, pop
D. push, pop, push, push, pop, pop
解析:
ABC经过push,push,push操作后,从栈顶到栈底元素为CBA,经过pop,pop,pop出栈操作后输出为CBA
2. 有六个元素按6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?( C )
A. 5 4 3 6 1 2 B. 4 5 3 1 2 6
C. 3 4 6 5 2 1 D. 2 3 4 1 5 6
解析:
选项A,6入栈,5入栈,5出栈,4入栈,4出栈,3入栈,3出栈,6出栈,2入栈,1入栈,1出栈,2出栈。
选项B, 6入栈,5入栈,4入栈,4出栈,5出栈,3入栈,3出栈,2入栈,1入栈,1出栈,2出栈,6出栈。
选项D,6入栈,5入栈,4入栈,3入栈,2入栈,2出栈,3出栈,4出栈,1入栈,1出栈,5出栈,6出栈。
选项C,6入栈,5入栈,4入栈,3入栈,3出栈,4出栈,此时栈内情况如下:
因为此时栈顶为5,栈底为6,由于栈只能先进后出,因此6不可能在5出栈前出栈。
3. 若已知一个栈的入栈序列是1,2,3,......n,其输出序列为p1,p2,p3,......pn,若p1=n,则pi为(C)
A. i B. n-i
C. n-i+1 D.不确定
解析:
栈是一种特殊的线性表,只能在固定的一端进行插入和删除操作。栈的运算是一种先进后出的操作原则。
本题中,入栈序列与输出序列的倒置是对应的,即输出序列的pi对应栈序列的n,输出序列的p2对应栈序列的n-1,
由此可推出,pi对应栈序列的n-i+1
4.若一个栈的输入序列为1,2,3 ...n,输出序列的第一个元素是i,则第j个输出元素是( D )
A. i-j-1 B. i-j
C. j-i+1 D. 不确定
解析:
不确定的,因为他没说要小次性全进完,也没说要一次性全出完,只要进入的序列不变就行了。
所以不确定的
设 I=2,J=3;
进入怕方法有好多种,出来的方法也有好多种的,
1进,1出,2进,2出,3进,4 进,4出,3 出 ,.....
5.设abcdef以所给的次序进栈,若在进栈操作时,允许退栈操作,则下面得不到的序列为( D )。(2分)
A.fedcba B. bcafed
C. dcefba D. cabdef
解析:
选项A,a入栈,b入栈,c入栈,d入栈,e入栈,f入栈,f出栈,e出栈,d出栈,c出栈,b出栈,a出栈。
选项B, a入栈,b入栈,b出栈,c入栈,c出栈,a出栈,d入栈,e入栈,f入栈,f出栈,e出栈,d出栈。
选项C, a入栈,b入栈,c入栈,d入栈,d出栈,c出栈,e入栈,e出栈,f入栈,f出栈,b出栈,a出栈。
选项D,a入栈,b入栈,c入栈,c出栈,此时栈内情况为:
此时不可能a先于b出栈。
6.若元素a,b,c,d,e,f依次进栈,允许进栈、退栈操作交替进行。但不允许连续三次进行退栈工作,则不可能得到的出栈序列是( D )
A:dcebfa B:cbdaef
C:bcaefd D:afedcb
解析:
选项A,a入栈,b入栈,c入栈,d入栈,d出栈,c出栈,e入栈,e出栈,b出栈,f入栈,f出栈,a出栈。
选项B,a入栈,b入栈,c入栈,c出栈,b出栈,d入栈,d出栈,a出栈,e入栈,e出栈,f入栈,f出栈。
选项C,a入栈,b入栈,b出栈,c入栈,c出栈,a出栈,d入栈,e入栈,e出栈,f入栈,f出栈,d出栈。
选项D,a入栈,a出栈,b入栈,c入栈,d入栈,e入栈,f入栈,f出栈,e出栈,d出栈,c出栈,b出栈。
不允许连续三次退栈,故D选项不可能得到。
7.设计一个判别表达式中左,右括号是否配对出现的算法,采用( D )数据结构最佳。
A.线性表的顺序存储结构
B. 队列
C. 线性表的链式存储结构
D. 栈
解析:
栈的经典应用有:数制转换、括号匹配的检验、行编辑程序、迷宫求解、表达式求值。
因此本题中括号匹配采用栈的数据结构最佳。
配对过程,就是一个左括号,一个右括号。你从头扫描字符串,看见左括号就进栈,看见右括号就把里面的最外一个左括号出栈,这样就是一对。等扫描完的时候,看栈里面好有没有。如果没有,那就是配对的,要不就是不配对。
8.为解决计算机与打印机之间速度不匹配的问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是 B
A)栈 B)队列 C)树 D)图
解析:
队列的主要应用为:汽车加油站、模拟打印机缓冲区、CPU分时系统等方面。
9.若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( B )。
A. |top[2]-top[1]|=0 B. top[1]+1=top[2]
C. top[1]+top[2]=m D. top[1]=top[2]
解析:
由于栈顶指针总是位于栈顶元素的下一个位置,所以当top1和top2相遇时,即top1+1=top2,两个栈满。
10.某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作,则不可能得到的顺序是( C )
A:bacde B:dbace
C:dbcae D:ecbad
解析:考察受限的双端队列的出队序列
选项A: 左入,左入,右入,右入,右入得到bacde
选项B:左入,左入,右入,左入,右入得到dbace
选项D: 左入,左入,左入,右入,左入得到ecbad
选项C不可能得到。
11.已知输入序列为abcd 经过输出受限的双向队列后能得到的输出序列有( BD )。
A. dacb B. cadb
C. dbca D. bdac
E. 以上答案都不对
解析:
输出受限的双端队列是指删除限制在一端进行,而插入允许在两端进行的队列。
输入受限的双端队列,即插入限制在一端进行,而删除仍允许在两端进行.
由于队列输出受限,故只能在一端进行输出:
分析答案A:A的输入序列为abcd,输出结果为dacb ,由输出受限性质可知da开头的结果只有dabc; A项为错误答案;
分析答案B:B的输出结果为:cadb ;其输入输出顺序为(可以画图帮助理解):
先输入a,然后在非输出端输入b,这时队列的序列为ba(假设左端为限制端,下同),接着在输入端输入c,这时队列的序列为bac,输出c,再输出a,在输出端输入d,这时队列的序列为bd,输出d,输出b;得到输出序列为cadb;
分析答案D:先输入a,接着在输出端输入b,然后再另一端输入c,最后在输出端输入d,这时队列的序列为cabd;其输出结果为dbac;
分析答案C:由db开头的输出结果只有dbac;故错误;
12.若以1234 作为双端队列的输入序列,则既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列是( C )。
A. 1234 B. 4132
C. 4231 D. 4213
解析:
有题可知队列为非受限队列,选项C 序列4231既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到
分析答案A:输入受限与输出受限的队列均可得到输出序列1234;如输出受限队列中,在非输出端输入1234,然后输出,则输出序列为1234;
分析答案B:输入受限队列中,输入1234;由于输出不受限,故输出结果可以为4132;
分析答案D:在输出受限队列中,输入1,然后在输出端输入2,接着在另一端输入3,最后在输出端输入4,则出对序列为4213
13.设栈S和队列Q的初始状态均为空,元素abcdefg依次进入栈S。
若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是bdcfeag,则栈S的容量至少是( C )
A)1 B)2
C)3 D)4
解析:最多栈容量3个,过程演示如下:
14.向一个带头结点HS的链栈中插入一个s所指结点时,则执行( B )
A. HS->next = s;
B. s->next = HS->next; HS->next = s ;
C. s->next = HS ; HS = s ;
D. s->next = HS ; HS = HS->next
15.一个循环队列Q最多可存储m个元素,已知其头尾指针分别是front和rear,则判定该循环队列为满的条件是( C )
A. Q.rear - Q.front == m
B. Q.rear != Q.front
C. Q.front ==( Q.rear +1)%m
D. Q.front == Q.rear %m +1
解析:
Q.rear队尾指针,Q.front队头指针。
C语言中循环队列的队满和队空的判断条件
if(Q.front==(Q.rear+1)%MAXSIZE)//队满
if(Q.front==Q.rear) //队空
16. 循环队列用数组A[0..m-1]存放其元素值,已知其头尾指针分别为front和rear,则当前元素个数为( A )。
A.(rear – front + m) mod m
B.rear - front+1
C.(front – rear + m) mod m
D.rear - front
解析:
17.若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?( B )
A. 1和5 B. 2和4
C. 4和2 D. 5和1
解析:
当出队列中删除一个元素,也就是出队,即front+1=3+1=4
再插入两个元素,即rear+2=0+2=2
18.用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时( D)。
A. 仅修改队头指针
B. 仅修改队尾指针
C. 队头、队尾指针都要修改
D. 队头, 队尾指针都可能要修改
解析:
不带头节点的话出队时可以直接让头指针向后移一下就可以了啊,链式队尾没必要修改。
队的特征就是入队修改队尾指针,出队修改对头指针
当队列中只有一个元素时,删除此元素后要将队列置空,此时要修改队尾指针,使尾指针与头指针相等
(即Q.rear = Q.front,见严蔚敏数据结构教材P62删除队头元素操作的实现)
Status DeQueue(LinkQueue &Q,QElemType &e) { //队列不空,则删除队头元素,用e返回其值,并返回OK. //否则返回ERROR if(Q.front==Q.rear) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); return OK; }