堆栈Word文件下载.docx
- 文档编号:22417369
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:16
- 大小:274.98KB
堆栈Word文件下载.docx
《堆栈Word文件下载.docx》由会员分享,可在线阅读,更多相关《堆栈Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
6、若用一个大小为6的数组来实现循环队列,且当rear和front的值分别为0,3。
当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为()。
A.1和5B.2和4C.4和2D.5和1
7、队列的插入操作是在(A)。
A.队尾B.队头C.队列任意位置D.队头元素后
8、循环队列的队头和队尾指针分别为front和rear,则判断循环队列为空的条件是(A)。
A.front==rearB.front==0
C.rear==0D.front=rear+1
9、一个顺序栈S,其栈顶指针为top,则将元素e入栈的操作是(A)。
A.*S->
top=e;
S->
top++;
B.S->
*S->
C.*S->
top=eD.S->
顺序栈top指针始终指向要储存下一个元素内存地址块。
栈的插入操作是先放元素,之后top指针下移。
10、表达式a*(b+c)-d的后缀表达式是(B)。
A.abcd+- B.abc+*d-C.abc*+d-D.-+*abcd
运算符是每个树的根节点,直接分解成后序序列。
11、将递归算法转换成对应的非递归算法时,通常需要使用(B)来保存中间结果。
A.队列B.栈(深度优先遍历递归)C.链表D.树
这里的栈即是指堆栈,是一种先进后出的数据结构。
系统实现递归时,本身也是用堆栈实现的,用来保存现场信息。
12、栈的插入和删除操作在(B)。
A.栈底B.栈顶C.任意位置D.指定位置
13、五节车厢以编号1,2,3,4,5顺序进入铁路调度站(栈),可以得到(C)的编组。
A.3,4,5,1,2B.2,4,1,3,5
C.3,5,4,2,1D.1,3,5,2,4
14、判定一个顺序栈S(栈空间大小为n)为空的条件是(A)。
A.S->
top==0B.S->
top!
=0
C.S->
top==nD.S->
=n
15、在一个链队列中,front和rear分别为头指针和尾指针,则插入一个结点s的操作为(C)。
A.front=front->
nextB.s->
next=rear;
rear=s
C.rear->
next=s;
rear=s;
(先挂结点,后移动rear)D.s->
next=front;
front=s;
16、一个队列的入队序列是1,2,3,4,则队列的出队序列是(A)。
A.1,2,3,4 B.4,3,2,1
C.1,4,3,2D.3,4,1,2
17、依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是(C)。
A.aB.bC.cD.d
18、正常情况下,删除非空的顺序存储结构的堆栈的栈顶元素,栈顶指针top的变化是(D)。
A.top不变B.top=0C.top=top+1D.top=top-1
19、判断一个循环队列Q(空间大小为M)为空的条件是(A)。
front==Q->
rearB.Q->
rear-Q->
front-1==M
front+1=Q->
rearD.Q->
rear+1=Q->
front
20、设计一个判别表达式中左右括号是否配对出现的算法,采用(C)数据结构最佳。
A.线性表的顺序存储结构B.队列C.栈D.线性表的链式存储结构
21、当用大小为N的数组链队列时,该队列的最大长度为(B)。
A.N B.N+1C.N-1D.N-2
n+1因为队列的头指针指向的是第一个元素的前一个结点,而不是指向第一个元素,因此队列的头指针要占用一个结点长度,所以队列的长度就是n+1;
22、队列的删除操作是在(A)。
A.队首 B.队尾C.队前D.队后
23、若让元素1,2,3依次进栈,则出栈次序不可能是()。
A.3,2,1 B.2,1,3C.3,1,2D.1,3,2
24、循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是()。
A.(rear-front+m)%mB.rear-front+1
C.rear-front-1D.rear-front
25、在解决计算机主机和打印机之间速度不匹配问题时,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则从该缓冲区中取走数据打印。
该缓冲区应该是一个()结构。
A.堆栈B.队列C.数组D.线性表
26、栈和队列都是()。
A.链式存储的线性结构B.链式存储的非线性结构
C.限制存取点的线性结构,栈和队列都是受限的线性结构。
D.限制存取点的非线性结构
27、在一个链队列中,假定front和rear分别为队头指针和队尾指针,删除一个结点的操作是()。
nextB.rear=rear->
next
next=frontD.front->
next=rear
28、队和栈的主要区别是()。
A.逻辑结构不同B.存储结构不同
C.所包含的运算个数不同D.限定插入和删除的位置不同
二、填空题
1、设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5,e6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1,则栈的容量至少应该是。
答案:
3
e2
(2)e4(3)e3
(1)e6(3)e5
(2)e1
(1)
此时栈里的元素个数。
2、一个循环队列Q的存储空间大小为M,其队头和队尾指针分别为front和rear,则循环队列中元素的个数为:
。
(rear-front+M)%M
3、在具有n个元素的循环队列中,队满时具有个元素。
n-1因为队尾指针总是指向空。
4、设循环队列的容量为70,现经过一系列的入队和出队操作后,front为20,rear为11,则队列中元素的个数为。
61
5、且当前队列的头已知循环队列的存储空间大小为20,指针和尾指针的值分别为8和3,且该队列的当前的长度为_______。
15
三、判断题
1、栈和队列都是受限的线性结构。
2、在单链表中,要访问某个结点,只要知道该结点的地址即可;
因此,单链表是一种随机存取结构。
顺序表才能实现。
3、以链表作为栈的存储结构,出栈操作必须判别栈空的情况。
四、程序分析填空题
1、已知栈的基本操作函数:
intInitStack(SqStack*S);
//构造空栈
intStackEmpty(SqStack*S);
//判断栈空
intPush(SqStack*S,ElemTypee);
//入栈
intPop(SqStack*S,ElemType*e);
//出栈
函数conversion实现十进制数转换为八进制数,请将函数补充完整。
voidconversion(){
InitStack(S);
scanf(“%d”,&
N);
while(N){
(1);
N=N/8;
}
while(
(2)){
Pop(S,&
e);
printf(“%d”,e);
}//conversion
(1)Push(S,N%8)
(2)!
StackEmpty(S)
2、写出算法的功能。
intfunction(SqQueue*Q,ElemType*e){
if(Q->
rear)
returnERROR;
*e=Q->
base[Q->
front];
Q->
front=(Q->
front+1)%MAXSIZE;
returnOK;
功能:
//若队列不空,则删除Q的队列元素,用返回其值,并且返回OK
//否则返回ERROR
3、阅读算法f2,并回答下列问题:
(1)设队列Q=(1,3,5,2,4,6)。
写出执行算法f2后的队列Q;
(2)简述算法f2的功能。
voidf2(Queue*Q)
{
DataTypee;
if(!
QueueEmpty(Q))
{
e=DeQueue(Q);
f2(Q);
EnQueue(Q,e);
}
(1)6,4,2,5,3,1
(2)将队列倒置
五、综合题
1、假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,请写出相应的入队列算法(用函数实现)。
voidEnQueue(Lnode*rear,ElemTypee)
{Lnode*new;
New=(Lnode*)malloc(sizeof(Lnode));
If(!
new)
returnERROR;
new->
data=e;
next=rear->
next;
Rear->
next=new;
rear=new;
2、已知Q是一个非空队列,S是一个空栈。
编写算法,仅用队列和栈的ADT函数和少量工作变量,将队列Q的所有元素逆置。
栈的ADT函数有:
voidmakeEmpty(SqStacks);
置空栈
voidpush(SqStacks,ElemTypee);
元素e入栈
ElemTypepop(SqStacks);
出栈,返回栈顶元素
intisEmpty(SqStacks);
判断栈空
队列的ADT函数有:
voidenQueue(Queueq,ElemTypee);
元素e入队
ElemTypedeQueue(Queueq);
出队,返回队头元素
intisEmpty(Queueq);
判断队空
voidQueueInvent(Queueq)
{ElemTypex;
makeEmpty(SqStacks);
while(!
isEmpty(Queueq))
{x=deQueue(Queueq);
push(SqStacks,ElemTypex);
isEmpty(SqStacks))
{x=pop(SqStacks);
enQueue(Queueq,ElemTypex);
3、对于一个栈,给出输入项A,B,C,D,如果输入项序列为A,B,C,D,试给出全部可能的输出序列。
出栈的可能序列:
ABCDABDCACDBACBDADCBBACDBADCBCADBCDA
CBDACBADCDBADCBA
第3章栈和队列自测卷答案
一、填空题
1.向量、栈和队列都是线性结构,可以在向量的任何位置插入和删除元素;
对于栈只能在栈顶插入和删除元素;
对于队列只能在队尾插入和队首删除元素。
2.栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。
不允许插入和删除运算的一端称为栈底。
3.队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
4.在一个循环队列中,队首指针指向队首元素的前一个位置。
当头指针指向首元素的时候循环队列用数组实现的话,尾指针指向最后一个元素时为满;
否则尾指针指向头指针前一个元素时为满
5.在具有n个单元的循环队列中,队满时共有n-1个元素。
6.向顺序栈中压入元素的操作是先存入元素,后移动栈顶指针。
7.从循环队列中删除一个元素时,其操作是先移动队首指针,后取出元素。
8.带表头结点的空循环双向链表的长度等于0。
解:
二、判断正误(判断下列概念的正确性,并作出简要的说明。
)
(×
)1.线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。
错,线性表是逻辑结构概念,可以顺序存储或链式存储,与元素数据类型无关。
)2.在表结构中最常用的是线性表,栈和队列不太常用。
错,不一定吧?
调用子程序或函数常用,CPU中也用队列。
(√)3.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)4.对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
)5.栈和链表是两种不同的数据结构。
错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。
)6.栈和队列是一种非线性数据结构。
错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(√)7.栈和队列的存储方式既可是顺序方式,也可是链接方式。
(√)8.两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。
)9.队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。
错,后半句不对。
)10.一个栈的输入序列是12345,则栈的输出序列不可能是12345。
错,有可能。
三、单项选择题
(B)1.栈中元素的进出原则是
A.先进先出B.后进先出C.栈空则进D.栈满则出
(C)2.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为
A.iB.n=iC.n-i+1D.不确定
解释:
当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,…,n,则出栈的序列是n,…,3,2,1。
(若不要求顺序出栈,则输出序列不确定)
(B)3.判定一个栈ST(最多元素为m0)为空的条件是
A.ST->
top<
>
0B.ST->
top=0C.ST->
m0D.ST->
top=m0
(A)4.判定一个队列QU(最多元素为m0)为满队列的条件是
A.QU->
rear-QU->
front==m0B.QU->
front-1==m0
C.QU->
front==QU->
rearD.QU->
rear+1
队满条件是元素个数为m0。
由于约定满队时队首指针与队尾指针相差1,所以不必再减1了,应当选A。
当然,更正确的答案应该取模,即:
QU->
front==(QU->
rear+1)%m0
(D)5.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为
(A)r-f;
(B)(n+f-r)%n;
(C)n+r-f;
(D)(n+r-f)%n
6.从供选择的答案中,选出应填入下面叙述?
内的最确切的解答,把相应编号写在答卷的对应栏内。
设有4个数据元素a1、a2、a3和a4,对他们分别进行栈操作或队操作。
在进栈或进队操作时,按a1、a2、a3、a4次序每次进入一个元素。
假设栈或队的初始状态都是空。
现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;
这时,第一次出栈得到的元素是A,第二次出栈得到的元素是B是;
类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;
这时,第一次出队得到的元素是C,第二次出队得到的元素是D。
经操作后,最后在栈中或队中的元素还有E个。
供选择的答案:
A~D:
①a1②a2③a3④a4
E:
①1②2③3④0
答:
ABCDE=2,4,1,2,2
7.从供选择的答案中,选出应填入下面叙述?
栈是一种线性表,它的特点是A。
设用一维数组A[1,…,n]来表示一个栈,A[n]为栈底,用整型变量T指示当前栈顶位置,A[T]为栈顶元素。
往栈中推入(PUSH)一个新元素时,变量T的值B;
从栈中弹出(POP)一个元素时,变量T的值C。
设栈空时,有输入序列a,b,c,经过PUSH,POP,PUSH,PUSH,POP操作后,从栈中弹出的元素的序列是D,变量T的值是E。
①先进先出②后进先出③进优于出④出优于进⑤随机进出
B,C:
①加1②减1③不变④清0⑤加2⑥减2
D:
①a,b②b,c③c,a④b,a⑤c,b⑥a,c
①n+1②n+2③n④n-1⑤n-2
ABCDE=2,2,1,6,4
注意,向地址的高端生长,称为向上生成堆栈;
向地址低端生长叫向下生成堆栈,本题中底部为n,向地址的低端递减生成,称为向下生成堆栈。
8.从供选择的答案中,选出应填入下面叙述?
在做进栈运算时,应先判别栈是否A;
在做退栈运算时,应先判别栈是否B。
当栈中元素为n个,做进栈运算时发生上溢,则说明该栈的最大容量为C。
为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的D分别设在这片内存空间的两端,这样,只有当E时,才产生上溢。
A,B:
①空②满③上溢④下溢
C:
①n-1②n③n+1④n/2
①长度②深度③栈顶④栈底
①两个栈的栈顶同时到达栈空间的中心点②其中一个栈的栈顶到达栈空间的中心点
③两个栈的栈顶在达栈空间的某一位置相遇④两个栈均不空,且一个栈的栈顶到达另一个栈的栈底
ABCDE=2,1,2,4,3
四、简答题
1.说明线性表、栈与队的异同点。
刘答:
相同点:
都是线性结构,都是逻辑结构的概念。
都可以用顺序存储或链表存储;
栈和队列是两种特殊的线性表,即受限的线性表,只是对插入、删除运算加以限制。
不同点:
①运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入、删除运算,因而是后进先出表LIFO;
队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。
②用途不同,堆栈用于子程调用和保护现场,队列用于多道作业处理、指令寄存及其他运算等等。
2.设有编号为1,2,3,4的四辆列车,顺序进入一个栈式结构的车站,具体写出这四辆列车开出车站的所有可能的顺序。
至少有14种。
①全进之后再出情况,只有1种:
4,3,2,1
②进3个之后再出的情况,有3种,3,4,2,13,2,4,13,2,1,4
③进2个之后再出的情况,有5种,2,4,3,12,3,4,12,1,3,42,1,4,32,1,3,4
④进1个之后再出的情况,有5种,1,4,3,21,3,2,41,3,4,21,2,3,41,2,4,3
3.顺序队的“假溢出”是怎样产生的?
如何知道循环队列是空还是满?
一般的一维数组队列的尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。
采用循环队列是解决假溢出的途径。
另外,解决队满队空的办法有三:
1设置一个布尔变量以区别队满还是队空;
2浪费一个元素的空间,用于区别队满还是队空。
3使用一个计数器记录队列中元素个数(即队列长度)。
我们常采用法②,即队头指针、队尾指针中有一个指向实元素,而另一个指向空闲元素。
判断循环队列队空标志是:
f=rear队满标志是:
f=(r+1)%N
4.设循环队列的容量为40(序号从0到39),现经过一系列的入队和出队运算后,有
①front=11,rear=19;
②front=19,rear=11;
问在这两种情况下,循环队列中各有元素多少个?
用队列长度计算公式:
(N+r-f)%N
①L=(40+19-11)%40=8②L=(40+11-19)%40=32
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 堆栈