南京林业大学数据结构复习(三)栈和队列

题目

第三章 栈和队列

  • 判断题

1. 栈和队列都是限制存取点的线性结构。( )
2. 中缀表达式:(a+b)*d+e/(f+a*d)+c的后缀表达式为:ab+d*efad+/*+c+。( )

3. 同一组不重复输入序列执行不同的入、出栈组合操作,所得结果也可能相同。( )

4. 设栈采用顺序存储结构。若已有i-1个元素入栈,则将第i个元素入栈时,入栈算法的时间复杂性为O(i)。  ( )
5. 栈和队列都是操作受限的线性表。栈是插入和删除只能在一端进行的线性表;队列是插入在一端进行,删除在另一端进行的线性表。  ( )

二.选择题

  1. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为s1,s2,s3,…sn,若s1=n, 则si为________
    A.
    i          B.n=i          C.n-i+1          D.以上都不对
  2. 若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在________种情况。
    A.5,4,3,2,1   B.2,1,5,4,3    C.4,3,1,2,5    D.2,3,5,4,1
  3. 一个递归算法必须包括________。
    A. 递归部分                           B. 终止条件和递归部分
    C. 迭代部分                           D. 终止条件和迭代部分
  4. 设有一个递归算法如下
    int fact(int n) {  //n大于等于0
     if(n<=0) return 1;
     else return n*fact(n-1);
    }
    则计算fact(n)需要调用该函数的次数为
    ________。 
    A n+1      B n-1            C n            D n+2
  5. 栈在________中有所应用。
    A.递归调用       B.函数调用      C.表达式求值        D.前三个选项都有
  6. 设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是________。
    A.2              B.3              C.4                D. 6
  7. 在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则当作进栈处理时,top的变化为________
    A.top不变        B.top=0           C.top--              D.top++
  8. 循环队列用A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,那么当前队列中的元素个数是________。
    A.(rear-front+m)%m    B.rear-front+1     C.rear-front-1    D.rear-front
  9. 循环队列存储在数组A[0..m-1]中,则出队时的操作为________。
    A. front=front+1                       B. front=(front+1)%(m-1)
    C. front=(front+1)%m                   D. front=(front+1)%(m+1)
  10. 链式栈结点为:(data,link),top指向栈顶。若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作________。
    A.x=top->data; top=top->link;     B.top=top->link; x=top->link;   
    C.x=top; top=top->link;           D.x=top->link;
    链栈结点为:(data,next),top指针指向栈顶结点。若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作________。
    A.x=top->data; top=top->next;     B.top=top->next; x=top->next;   
    C.x=top; top=top->next;           D.x=top->next;
  11. 用链接方式存储的队列,在进行删除运算时________。
    A. 仅修改
    头指针                      B. 仅修改尾指针
    C.
    头、尾指针都要修改              D. 头、尾指针可能都要修改
  12. 循环队列存储在数组A[0..m]中,则入队时的操作为________。
    A. rear=rear+1                       B. rear=(rear+1)%(m-1)
    C. rear=(rear+1)%m                   D. rear=(rear+1)%(m+1)
  13. 最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是_______。
    A. (rear+1)%n==front                  B. rear==front
    C.rear+1==front                      D. (rear-l)%n==front
  14. 栈和队列的共同点是________。
    A. 都是先进先出                       B. 都是先进后出  
    C. 只允许在端点处插入和删除元素       D. 没有共同点
  15. 设计一个判别表达式中左,右括号是否配对出现的算法,采用______数据结构最佳。
    A.线性表的顺序存储结构              B.队列    
    C. 线性表的链式存储结构              D. 栈
  16. 为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是________
    A.队列           B.栈            C. 线性表           D.有序表
  17. 已知循环队列存储在一维数组A[0..n-1]中,且队列非空front和rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第1个进入队列的元素存储在A[0]处,则初始时front和rear的值分别是________。 
    A.0,0           B.0,n-1          C.n-1,0         D.n-1,n-1 
  18. 与中缀表达式a*b+c/d-e等价的前缀表达式是________。
    A.-+*ab/cde      B.*+/-abcde      C.abcde*+/-      D.+*ab-/cde
  19. 对于循环队列________。
    A.无法判断队列是否为空              B.无法判断队列是否为满
    C.队列不可能满                      D.以上说法都不是
  20. 若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为________
    A. 1和5          B.2和4          C.4和2           D.5和1
    若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为2和5,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为________。
    C
    A. 1和5          B.0和4          C.4和0           D.5和1
     

三.填空题

  1. 设SS[1..maxsize]为一个顺序存储的栈,变量top指示栈顶元素的位置,当栈未满时,将元素e压入栈需执行下列语句:________和________。
  2. 设顺序栈存放在s.elem[0…m-1]中,栈顶指针为 s.top,栈底位置是m-1,则栈空条件是________,栈满条件是________
  3. 为了增加内存空间的利用率和减少发生上溢的可能性,由两个栈共享一片连续的内存空间时,应将两栈的________分别设在这片内存空间的两端,这样,只有当________时,才产生上溢。
  4. 设循环向量有m个元素,循环向量中有一个循环队列。在循环队列中,设队头指针front指向队头元素,队尾指针rear指向队尾元素后的一个空闲单元。则在循环队列中,队满标志为________,队空标志为________。 
  5. 数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为________。
  6. 设循环队列的容量为70(序号从1到70),现经过一系列的入队与出队运算后,有front=23,rear=12,循环队列中有________个元素。 
  7. 设栈S和队列Q的初始状态为空,元素a,b,c,d,e,f依次通过栈S,一个元素出栈后即进入队列Q。若这6个元素出队列的顺序是b,d,c,f,e,a,则栈S的容量至少应该是________。
  8. 多个栈共存时,最好用________作为存储结构。
  9. 若已知一个栈的入栈序列是1,2,3,...,n,其输出序列为p1,p2,p3,...,pn,若p1=n,则pi为________。
  10. 设有一个空栈,栈空间的首地址为1000H(十六进制),现有输入序列为1,2,3,4,5,经过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH之后,输出序列是________,而栈顶元素指针值是________H。设栈为顺序栈,每个元素占4字节,设栈的地址由低端到高端增长(栈底在低字节端,栈顶在高字节端
  • 算法应用题

1. 有5个元素,其入栈次序为A,B,C,D,E,在各种可能的出栈序列中,第一个出栈元素为C且第二个出栈元素为D的出栈序列有哪几个?

参考答案:

一. 判断题:

1

2

3

4

5

X

X

二. 选择题:

1

2

3

4

5

6

7

8

9

10

C

C

B

A

D

B

C

A

C

A

11

12

13

14

15

16

17

18

19

20

D

D

B

C

D

A

B

A

D

B

17题解析:

在队列中插入,只能在队尾进行。rear指向队尾元素,因此插入时,要先将rear指针后移一个位置,然后再将元素放入数组。如果要使第一个进入队列的元素存储在A[0]处,rear的初始值应该为n-1。而插入第一个元素之后,front指针不变,队尾指针要指向队尾元素。因此,rear指针的初值应为n-1,front指针为0。

  • 填空题
    1.
    top++  SS[top]=e
    2. s.top==m  s.top==0
    3.
    栈底    两栈栈顶(在栈内任意地方)相遇
    4. (rear+1)%m==front front==rear
    5.(n+r-f)%n
    6.
    59
    7. 3
    8.
    链式存储结构
    9.n-i+1

10.2 3,1008  

四. 算法应用题

  1. 三个:CDEBA,CDBEA,CDBAE
     

解析: 

判断

只讲第二题:

波兰式(前缀)和逆波兰式(后缀)是通用的会一个就会第二个。

简单来讲就是将每一步的中缀运算加括号,将运算符挪到括号后面,注意一一对应

举个例子:

c*(a+b)+d转成后缀

1 加括号 ((c*(a+b))+d)

2 移到括号后面 cab+*d+

因此中缀表达式:(a+b)*d+e/(f+a*d)+c的后缀表达式不是ab+d*efad+/*+c+

而是ab+d*efad*+/+c+

选择

1 2 略

递归部分是指算法在递归过程中自我调用的部分。通过递归调用自身,问题可以被分解成更小的子问题,直到达到终止条件。

迭代部分是指在递归算法中进行循环迭代的部分,可以用来处理非递归的步骤或者优化算法性能。在一些情况下,递归算法可以通过迭代算法的方式来实现,以避免递归带来的额外开销。

4 略

5  AB选项其实式栈帧。

栈帧(Stack Frame),也称为活动记录(Activation Record)或者函数调用帧(Function Call Frame),是在计算机程序中用于支持函数调用和返回的一种数据结构。

在程序执行过程中,每当一个函数被调用,系统会为该函数创建一个对应的栈帧,用于保存函数的局部变量、参数、返回地址以及其他与函数调用相关的信息。

6

 根据给定的条件,元素依次进入栈S,然后出栈后进入队列Q。出队的顺序是e2、e4、e3、e6、e5和e1。

观察出队的顺序可以发现,第一个出队的元素是e2,而栈的特点是后进先出,所以e1必须是最先进入栈S的元素。至少有两个。然后是e4,e3至少3个,现在空2个,在进入两个。

所以,栈S的容量至少应该是3。

地址高端作为栈底

8 9 10 略

11-15 略

16 清除缓存区的函数可以用getchar()清除\n

17 - 20 略

填空

1-10 略

简答

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

markreisen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值