1、设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是?
A.3 2 1 5 4
B.5 1 2 3 4
C.4 5 1 3 2
D.4 3 1 2 5
A
2、下列关于栈的叙述中,错误的是:
-
采用非递归方式重写递归程序时必须使用栈
-
函数调用时,系统要用栈保存必要的信息
-
只要确定了入栈次序,即可确定出栈次序
-
栈是一种受限的线性表,允许在其两端进行操作
A.仅 1
B.仅 1、2、3
C.仅 1、3、4
D.仅 2、3、4
C
1.计算斐波拉契数列迭代实现只需要一个循环即可实现。
3.出栈次序可能存在多种情况。
4.栈是一种受限的线性表,只允许在一端进行操作。
3、循环顺序队列中是否可以插入下一个元素()。
A.与队头指针和队尾指针的值有关
B.只与队尾指针的值有关,与队头指针的值无关
C.只与数组大小有关,与队首指针和队尾指针的值无关
D.与曾经进行过多少次插入操作有关
A
判断队列为空的条件是:front=rear。
判断队列为满的条件是:(rear+1)%size=front。
4、设一个堆栈的入栈顺序是1、2、3、4、5。若第一个出栈的元素是4,则最后一个出栈的元素必定是:
A.1
B.3
C.5
D.1或者5
D
1234入栈,4321出栈,5入栈,5出栈。
1234入栈,4出栈,5入栈,5321出栈。
5、设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 5, 6, 4, 7, 3, 1},则栈S的容量至少是:
A.1
B.2
C.3
D.4
D
假设2刚入栈就出栈,在5出栈前,栈S中的元素为{1,3,4,5},易知4即为栈S的最小容量。
6、若借助堆栈将中缀表达式a+b*c+(d*e+f)*g
转换为后缀表达式,当读入f
时,堆栈里的内容是什么(按堆栈自底向上顺序)?
A.+(*+
B.+(+
C.++(+
D.abcde
B
①任何中缀表达式都由运算数,运算符,括号(大,中,小),这三部分组成。
②从中缀表达式的左边开始扫描(脑中自己想像的),若遇到运算数时,则直接将其输出(不压入堆栈)。
③若遇到左括号,则将其压栈。
④若遇到右括号,表示括号内的中缀表达式已经扫描完毕。这时需将栈顶的运算符依次弹出并输出,直至遇到左括号。
⑤若遇到的是运算符:(优先级小的运算符弹出并输出)(在栈中括号的优先级最低)(括号弹出但不输出)
a、如果该运算符的优先级大于栈顶运算符的优先级时,将其压栈。
b、如果该运算符的优先级小于栈顶运算符的优先级时,将栈顶运算符弹出并输出,接着和新的栈顶运算符比较,若小于,继续将栈顶运算符弹出并输出......(一直递归下去,直至运算符的优先级大于栈顶运算符为止)。
⑥最后一步,若扫描到中缀表达式的末尾(即扫描结束),栈中还有存留的运算符,依次弹出并输出即可。
7、表达式a*(b+c)-d
的后缀表达式是:
A.a b c + * d -
B.a b c d * + -
C.a b c * + d -
D.- + * a b c d
A
①先按照运算符的优先级对中缀表达式加括号
((a*(b+c))-d)
②将运算符移到括号的后面
((a(bc)+)*d)-
③去掉括号
abc+*d-
8、若采用带头、尾指针的单向链表表示一个堆栈,那么该堆栈的栈顶指针top应该如何设置?
A.将链表头设为top
B.将链表尾设为top
C.随便哪端作为top都可以
D.链表头、尾都不适合作为top
A
将链表头设为top(栈顶),可以使出栈及入栈操作都在表头进行,因为栈是插入和删除只能在一端进行的线性表的条件
9、利用大小为n
的数组(下标从0
到n-1
)存储一个栈时,假定栈从数组另一头开始且top==n
表示栈空,则向这个栈插入一个元素时,修改top指针应当执行:
A.top=0
B.top++
C.top--
D.top
不变
C
由于top==n表示栈空(top==1表示栈满),于是堆栈的元素从高位向低位存储,因此入栈时,需要向下移动指针,即top--。
10、若已知一队列用单向链表表示,该单向链表的当前状态(含3个对象)是:1->2->3
,其中x->y
表示x
的下一节点是y
。此时,如果将对象4
入队,然后队列头的对象出队,则单向链表的状态是:
A.1->2->3
B.2->3->4
C.4->1->2
D.答案不唯一
B
1出队,4入队。
11、若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3。从当前队列中删除一个元素,再加入两个元素后,rear和front的值分别为( )。
A.1和5
B.2和4
C.4和2
D.5和1
B
循环队列只能队尾插入元素、在队头删除元素。插入元素时,rear++;删除元素时,front++。
rear=0+2=2
front=3+1=2
12、判断一个循环队列QU(最多元素为MaxSize)为空的条件是()。
A.QU.front == QU.rear
B.QU.front != QU.rear
C.QU.front == (QU.rear + 1) % MaxSize
D.QU.front != (QU.rear + 1) % MaxSize
A
13、用单链表表示的链队的队头在链表的()位置。
A.链头
B.链尾
C.链中
D.均可以
A
14、Suppose that all the integer operands are stored in the stack S1, and all the operators in the other stack S2. The function F()
does the following operations sequentially:
-
(1) Pop two operands
a
andb
from S1; -
(2) Pop one operator
op
from S2; -
(3) Calculate
b op a
; and -
(4) Push the result back to S1.
Now given { 5, 8, 3, 2 } in S1 (where 2 is at the top), and { *
, -
, +
} in S2 (where +
is at the top). What is remained at the top of S1 after F()
is executed 3 times?
A.-15
B.15
C.-20
D.20
B
第一次执行F()
,弹出a=2,b=3,弹出op为+,计算3+2=5并把5重新压回栈S1中。
S1{5, 8, 5}
第二次执行,弹出a=5,b=8,op为-,计算8-5=3,把3压回栈中。
S1{5, 3}
第三次执行,弹出a=3,b=5,op为 * ,计算5 *3=15,并把15压回栈中。
S1{15}
15、若已知一个栈的入栈序列是1,2,3,4,其出栈序列为P1,P2,P3,P4,则P2,P4不可能是( )。
A.2,4
B.2,1
C.4,3
D.3,4
C
1234√ 3214√
3241√ 4231×
1423× 2143×
1324× 2314√
4先出栈的情况下,3必须在它后一个出栈,而中间不可能是别的元素出栈。
16、设有一个顺序共享栈Share[0:n-1],其中第一个栈顶指针top1的初值为-1,第二个栈顶指针top2的初值为n,则判断共享栈满的条件是( )。
A.top2-top1==1
B.top1-top2==1
C.top1==top2
D.以上都不对
A
判断共享栈满的条件是top+1==top2。共享栈,top1从左往右走,top2从右往左走,当这两个指针相邻的时候,栈满。
17、循环队列放在一维数组A[0...M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中,正确的是( )。
A.队空:end1==end2;队满:end1==(end2+1)mod M
B.队空:end1==end2;队满:end2==(end1+1)mod (M-1)
C.队空:end2==(end1+1) mod M;队满:end1==(end2+1) mod M
D.队空:end1==(end2+1) mod M;队满:end2==(end1+1)mod (M-1)
A
判断队列为空的条件是:front=rear
判断队列为满的条件是:(rear+1)%size=front
18、下列说法中,正确的是( )。
A.消除递归不一定需要使用栈
B.对同一输入序列进行两组不同的合法入栈和出栈组合操作,所得的输出序列也一定相同
C.通常使用队列来处理函数或过程调用
D.队列和栈都是运算受限的线性表,只允许在表的两端进行运算
A
B.不一定相同
C.通常使用栈来处理函数或过程调用
D.队列和栈都是运算受限的线性表(插入和删除),并不是只允许在表的两端进行运算
19、数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为( )。
A.r-f
B.(n+f-r)%n
C.n+r-f
D.(n+r-f)%n
D
队列的长度是:(rear-front+size)%size
20、设有一个递归算法如下
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
当参数为n的时候调用一次,n一直减到0共内部调用n次,即总共调用n+1次。递归n次调用n+1次方法。
21、若一个栈以向量V[1..n]存储,初始栈顶指针top设为n+1,则元素x进栈的正确操作是( )。
A.top++; V[top]=x;
B.V[top]=x; top++;
C.top--; V[top]=x;
D.V[top]=x; top--;
C
22、下列与队列结构有关联的是
A.函数的递归调用
B.数组元素的引用
C.多重循环的执行
D.先到先服务的作业调度
D
队列是一种先进先出的线性表(FIFO)。
23、最不适合用作链队的链表是()。
A.只带队头指针的非循环双链表
B.只带队头指针的循环双链表
C.只带队尾指针的循环双链表
D.只带队尾指针的循环单链表
A
24、现有队列 Q 与栈 S,初始时 Q 中的元素依次是{ 1, 2, 3, 4, 5, 6 }(1在队头),S 为空。若允许下列3种操作:(1)出队并输出出队元素;(2)出队并将出队元素入栈;(3)出栈并输出出栈元素,则不能得到的输出序列是:
A.1, 2, 5, 6, 4, 3
B.2, 3, 4, 5, 6, 1
C.3, 4, 5, 6, 1, 2
D.6, 5, 4, 3, 2, 1
C
C.3, 4, 5, 6, 2, 1
25、若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶元素所在的下标,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( )。
A.|top[2]-top[1]|=0
B.top[1]+1=top[2]
C.top[1]+top[2]=m
D.top[1]=top[2]
B
判断共享栈满的条件是top+1==top2。
26、表达式3*2^(4+2*2-6*3)-5
求值过程中当扫描到6时,对象栈和运算符栈为( ),其中^为乘幂 。
A.3, 2, 4, 1, 1;( ^ ( + -
B.3, 2, 8;( * ^ -
C.3, 2, 4, 2, 2;( * ^ ( -
D.3, 2, 8;( * ^ ( -
D
27、在作进栈运算时,应先判别栈是否(① );在作退栈运算时应先判别栈是否(② )。当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③ )。
①: A. 空 B. 满 C. 上溢 D. 下溢
②: A. 空 B. 满 C. 上溢 D. 下溢
③: A. n-1 B. n C. n+1 D. n/2
A.① C ② D ③ B
B.① B ② A ③ B
C.① B ② B ③ A
D.① B ② A ③ A
B
在作进栈运算时,应先判别栈是否满。
在作退栈运算时应先判别栈是否空。
当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为n。
28、用S表示入栈操作,X表示出栈操作,若元素入栈的顺序为1234,为了得到1342出栈顺序,相应的S和X的操作串为( )。
A.SXSSSXXX
B.SXSXSXSX
C.SSSSXXXX
D.SXSSXSXX
D
SX(1入栈,1出栈)SSX(23入栈,3出栈)SXX(4入栈,42出栈)
29、循环队列的队满条件为 ( )。
A.(sq.rear+1) % maxsize ==(sq.front+1) % maxsize
B.(sq.front+1) % maxsize ==sq.rear
C.(sq.rear+1) % maxsize ==sq.front
D.sq.rear ==sq.front
C
判断队列为满的条件是:(rear+1)%size=front
30、栈和队列的共同点是( )。
A.都是先进先出
B.都是先进后出
C.只允许在端点处插入和删除元素
D.没有共同点
C