您的位置: 网站首页 > 程序开发 > 数据结构 > 第3章 栈和队列 > 【3.8 本 章 小 结】

3.8 本 章 小 结

 

3.8 

本章主要介绍了两种运算受限的线性表:栈和队列。讨论了它们的基本概念、存储结构、基本运算的实现以及一些应用实例。

对于栈来说,它的插入和删除运算均在表的同一端进行,是一种“先进后出”的线性表,随着节点的进栈和出栈,用栈顶指针指示栈顶的变化。用顺序存储结构时,要注意栈满、栈空的条件;用链式存储结构时,要注意链的方向。

对于队列来说,它的插入运算在表的一端进行,而删除运算在表的另一端进行,是一种“先进先出”的线性表,分别用队头指针和队尾指针指示队列头节点和尾节点的变化。熟记队列中节点的插入、删除运算的算法及其溢出的条件。在顺序队列结构中,当节点不断插入、删除时,会很快移到队列末端而造成假溢出,用循环队列是一个好的解决方法。

3.9     

1选择题

1)设有顺序栈S,元素s1s2s3s4s5s6依次入栈,如果6个元素出栈的顺序是s2s3s4s6s5s1,则栈的容量至少应该是     

A2                    B3                     C5                     D6

2)若有一个栈的输入序列是abc,则通过入栈、出栈操作可能得到abc的不同排列个数为     

A4                    B5                     C6                     D7

3和顺序栈相比,链栈有一个比较明显的优势是     

A.通常不会出现栈满的情况

B.通常不会出现栈空的情况

C.插入操作更容易实现

D.删除操作更容易实现

4)若一个栈的输入序列是1234,…,n,输出序列的第一个元素是n,则第i个输出元素是     

A.不确定            Bn-i                  Cn-i+1              Dn-i-1

5)以下说法正确的是     

A.因链接本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况

B.因顺序栈本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况

C.对于链栈而言,在栈满状态下,如果再进行入栈操作,则会发生“上溢”

D.对于顺序栈而言,在栈满状态下,如果再进行入栈操作,则会发生“下溢”

6)顺序队列的入队操作为     

Asq.rear=sq.rear+1;sq.data[sq.rear]=x;

Bsq.rear=(sq.rear)=x;sqrear=sq.rear+1;

Csq.rear=(sq.rear+1)%maxsize;sq.data[sq.rear]=x;

Dsq.data=[sqrear]=x; sq.rear=(sq.rear+1)%maxsize;

7)循环队列的入队操作为     

Asq.rear=sq.rear+1;sq.data[sq.rear]=x;

Bsq.data[sq.rear]=x; sq.rear=sq.rear+1;

Csq.rear=(sq.rear+1)%maxsize;sq.data[sqrear]=x;

Dsq.data[sq.rear]=x;sq.rear=(sq.rear+1)%maxsize;

8)顺序队列的出队操作为     

Asq.front=(sq.front+1)%maxsize;

Bsq.front=sq.front+1;

Csq.rear=(sq.rear+1)%maxsize;

Dsq.rear=sq.rear+1;

9)循环队列的出队操作为     

Asq.front=(sq.front+1)%maxsize;

Bsq.front=sq.front+1;

Csq.rear=(sq.rear+1)%maxsize;

Dsq.rear=sq.rear+1;

10)循环队列的队满条件为     

A(sq.rear+1)maxsize= =(sq.front+1)%maxsize;

B(sq.rear+1)maxsize= =sq.front+1;

C(sq.rear+1)maxsize= =sq.front;

Dsq.rear= =sq.front;

11)循环队列的队空条件为     

A(sq.rear+1)maxsize= =(sq.front+1)%maxsize;

B(sq.rear+1)maxsize= =sq.front+1;

C(sq.rear+1)maxsize= =sq.front;

Dsq.rear= =sq.front;

12)如果以链表作为栈的存储结构,则出栈操作时     

A.必须判别栈是否满

B.判别栈元素的类型

C.必须判别栈是否空

D.对栈不做任何判别

13)向一个栈顶指针为Top的链栈中插入一个s所指节点时,其操作步骤为     

ATop->next=s;

Bs->next=Top->next;Top->next=s;

Cs->next=Top;Top=s;

Ds->next=Top;Top=top->next;

14)从栈顶指针为Top的链栈中删除一个节点,并将被删节点的值保存到x中,其操作步骤为     

Ax=Top->data;Top=Top->next;

BTop=Top->next;x=Top->data;

Cx=Top;Top=Top->next;

Dx=Top->data;

15在一个链队中,若fr分别为队头、队尾指针,则插入s所指节点的操作为    

Af->next=s;f=s;                                          Br->next=s;r=s;

Cs->next=r;r=s;                                          Ds->next=f;f=s;

16)一个栈的入栈序列是abcde,则栈不可能的输出序列是     

Aedcba                                 Bdecba

Cdceab                                  Dabcde

17一个队列的入队序列是1234,则队列可能的输出序列是     

A4321                                      B1234

C1432                                      D3241

18)设计一个判别表达式中左、右括号是否配对出现的算法,采用       数据结构最佳。

A.线性表的顺序存储结构                           B.栈

C.队列                                                 D.线性表的链式存储结构

19)若以1234作为双端队列的输入序列,则既不能由输入受限双端队列得到,也不能由输出受限双端队列得到的输出序列是     

A1234                                      B4132

C4231                                      D4213

2填空题

1)向栈中压入元素的操作是              

2)对栈进行退栈时的操作是              

3)在一个循环队列中,队首指针指向队首元素的              

4)从循环队列中删除一个元素时,其操作是               

5)在具有n个单元的循环队列中,队满时共有            个元素。

6)假设为循环队列分配的向量空间为Q[20],若队列的长度和队头指针值分别为1317,则当前尾指针的值为              

7)栈的特点是               ,队列的特点是              

8)栈结构通常采用的两种存储结构是                             

3问答题

1)栈与队列可以利用C语言的哪一种数据结构来表示?请举出一些其性质类似于栈和队列的例子。

2)叙述栈和队列之间的区别和联系。

3)设有4个元素abcd进栈,给出它们所有可能的出栈次序。

4)与一般队列相比,环形队列有什么优点?并给出环形队列队满和队空的判断条件。

5)若用一个大小为6的一维数组来实现循环队列,且当前rearfront的值分别为03。当从队列中删除一个元素,再加入两个元素后,rearfront的值分别是多少?

4上机操作题

1)已知num为无符号十进制整数,请写一个非递归算法,依次输出num所对应的r进制数的各位数字。

2)在一个顺序循环队列中,用count存放队列长度,要求充分利用循环队列中所有的存储空间,请设计循环队列的入队、出队算法。

3)设用带表头节点的循环链表表示队列,且仅设一个尾指针,尾指针指向数据域值为队尾元素的节点,不设队首指针,请编写实现置空队列、入队和出队的算法。

4)已知q是一个非空顺序队列,s是一个顺序栈,请设计一个算法,实现将队列q中所有元素逆置。