数据结构期末复习第三章栈和队列

 

第三章:栈和队列

      

栈的特性:后进先出(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;
}

 

 

 

 

 

 

posted @ 2015-01-16 15:43  技术宅星云  阅读(2549)  评论(0编辑  收藏  举报