题目
第三章 栈和队列
- 判断题
1. 栈和队列都是限制存取点的线性结构。( )
2. 中缀表达式:(a+b)*d+e/(f+a*d)+c的后缀表达式为:ab+d*efad+/*+c+。( )
3. 同一组不重复输入序列执行不同的入、出栈组合操作,所得结果也可能相同。( )
4. 设栈采用顺序存储结构。若已有i-1个元素入栈,则将第i个元素入栈时,入栈算法的时间复杂性为O(i)。 ( )
5. 栈和队列都是操作受限的线性表。栈是插入和删除只能在一端进行的线性表;队列是插入在一端进行,删除在另一端进行的线性表。 ( )
二.选择题
- 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为s1,s2,s3,…sn,若s1=n, 则si为________。
A.i B.n=i C.n-i+1 D.以上都不对 - 若让元素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 - 一个递归算法必须包括________。
A. 递归部分 B. 终止条件和递归部分
C. 迭代部分 D. 终止条件和迭代部分 - 设有一个递归算法如下
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 - 栈在________中有所应用。
A.递归调用 B.函数调用 C.表达式求值 D.前三个选项都有 - 设栈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 - 在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则当作进栈处理时,top的变化为________。
A.top不变 B.top=0 C.top-- D.top++ - 循环队列用A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,那么当前队列中的元素个数是________。
A.(rear-front+m)%m B.rear-front+1 C.rear-front-1 D.rear-front - 循环队列存储在数组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) - 链式栈结点为:(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; - 用链接方式存储的队列,在进行删除运算时________。
A. 仅修改队头指针 B. 仅修改队尾指针
C. 队头、队尾指针都要修改 D. 队头、队尾指针可能都要修改 - 循环队列存储在数组A[0..m]中,则入队时的操作为________。
A. rear=rear+1 B. rear=(rear+1)%(m-1)
C. rear=(rear+1)%m D. rear=(rear+1)%(m+1) - 最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是_______。
A. (rear+1)%n==front B. rear==front
C.rear+1==front D. (rear-l)%n==front - 栈和队列的共同点是________。
A. 都是先进先出 B. 都是先进后出
C. 只允许在端点处插入和删除元素 D. 没有共同点 - 设计一个判别表达式中左,右括号是否配对出现的算法,采用______数据结构最佳。
A.线性表的顺序存储结构 B.队列
C. 线性表的链式存储结构 D. 栈 - 为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是________。
A.队列 B.栈 C. 线性表 D.有序表 - 已知循环队列存储在一维数组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 - 与中缀表达式a*b+c/d-e等价的前缀表达式是________。
A.-+*ab/cde B.*+/-abcde C.abcde*+/- D.+*ab-/cde - 对于循环队列________。
A.无法判断队列是否为空 B.无法判断队列是否为满
C.队列不可能满 D.以上说法都不是 - 若用一个大小为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
三.填空题
- 设SS[1..maxsize]为一个顺序存储的栈,变量top指示栈顶元素的位置,当栈未满时,将元素e压入栈需执行下列语句:________和________。
- 设顺序栈存放在s.elem[0…m-1]中,栈顶指针为 s.top,栈底位置是m-1,则栈空条件是________,栈满条件是________。
- 为了增加内存空间的利用率和减少发生上溢的可能性,由两个栈共享一片连续的内存空间时,应将两栈的________分别设在这片内存空间的两端,这样,只有当________时,才产生上溢。
- 设循环向量有m个元素,循环向量中有一个循环队列。在循环队列中,设队头指针front指向队头元素,队尾指针rear指向队尾元素后的一个空闲单元。则在循环队列中,队满标志为________,队空标志为________。
- 数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为________。
- 设循环队列的容量为70(序号从1到70),现经过一系列的入队与出队运算后,有front=23,rear=12,循环队列中有________个元素。
- 设栈S和队列Q的初始状态为空,元素a,b,c,d,e,f依次通过栈S,一个元素出栈后即进入队列Q。若这6个元素出队列的顺序是b,d,c,f,e,a,则栈S的容量至少应该是________。
- 多个栈共存时,最好用________作为存储结构。
- 若已知一个栈的入栈序列是1,2,3,...,n,其输出序列为p1,p2,p3,...,pn,若p1=n,则pi为________。
- 设有一个空栈,栈空间的首地址为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
四. 算法应用题
- 三个: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 略
3 递归部分是指算法在递归过程中自我调用的部分。通过递归调用自身,问题可以被分解成更小的子问题,直到达到终止条件。
迭代部分是指在递归算法中进行循环迭代的部分,可以用来处理非递归的步骤或者优化算法性能。在一些情况下,递归算法可以通过迭代算法的方式来实现,以避免递归带来的额外开销。
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。
7 地址高端作为栈底
8 9 10 略
11-15 略
16 清除缓存区的函数可以用getchar()清除\n
17 - 20 略
填空
1-10 略
简答
略