数据结构与算法--栈与队列(单选)(附带部分题解)

本文探讨了栈和队列这两种基本数据结构的操作和性质,包括合法的栈输出序列、栈与递归的关系、循环队列的插入与删除、以及如何将中缀表达式转换为后缀表达式。同时,还涉及到了斐波那契数列的迭代实现和操作符的优先级在计算表达式时的作用。
摘要由CSDN通过智能技术生成

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、下列关于栈的叙述中,错误的是:

  1. 采用非递归方式重写递归程序时必须使用栈

  2. 函数调用时,系统要用栈保存必要的信息

  3. 只要确定了入栈次序,即可确定出栈次序

  4. 栈是一种受限的线性表,允许在其两端进行操作

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的数组(下标从0n-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 and b 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值