数据结构选择题——栈和队列

1.栈和队列具有相同的()。

A、抽象数据类型

B、逻辑结构

C、存储结构

D、运算

答案:B

2、栈和队列的主要区别在于()。
A、存储结构不同
B、逻辑结构不同
C、插入、删除规则不同
D、所含元素不同

答案:C

栈的规则:后进先出;队列:先进先出

3、()不是栈的基本操作。
A、删除栈顶元素
B、判断栈是否为空
C、将栈置为空栈
D、返回栈底元素

答案:D

4、链栈不同于顺序栈的优势之处在于()。
A、插入操作更容易实现
B、删除操作更容易实现
C、通常不会出现栈满的情况
D、通常不会出现栈空的情况

答案:C

链栈的存储空间动态分配,而顺序栈是一开始就定义了存储空间大小

5、顺序栈存放在数组a[n]中,top指向栈顶,top= -1表示栈空。在栈不满的情况下,元素x进栈的操作为()。
A、a[top--]=x
B、a[--top]=x    
C、a[top++]=x
D、a[++top]=x

答案:D

第一个元素进栈,第一个元素应是a[0],进栈时应该先将top置为0,因此使用++top,使其在进栈前让top+1

6、一个空顺序栈的栈顶指针为top= -1,执行Push、Push、Pop、Push、Push、Pop、Pop、Push、Push操作后,栈顶指针的值为()。
A、3
B、2
C、1
D、0

答案:B

Push进栈,Pop出栈,对于题目进出栈顺序,top原本为-1,其变化为:+1+1-1+1+1-1-1+1+1=3。

-1+3=2

7、链栈的结点表示为(data, next),top指向栈顶。则插入结点x的操作为()。
A、top->next=x
B、x->next=top; top=x
C、x->next=top; top=top->next
D、x->next=top->next;top->next=x

答案:B

如图,将结点x接入链中要先让栈顶的next指向x,此时x成为栈顶,让top指向x。

8、链栈的结点表示为(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

答案:A

先保存值data再删除

9、若一个栈以向量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

栈底元素为最大序号的元素,因此每次进栈前先令top-1,

10、已知入栈序列为1,2,3,…,n,输出序列为p1,p2,p3,…,pn。若p1=n,则pi为(B)。
A、i-1
B、n-i+1
C、n-i
D、不确定

答案:B

由于p1=n,可知,所有元素进栈后,才开始出栈,因此出栈序列为n,n-1,n-2,...,1。

容易得出pi=n-i+1

11、设a,b,c,d,e,f依次进栈,且进栈时允许出栈。则不可能得到的出栈序列是()。
A、fedcba
B、dbcafe
C、dcebaf
D、bacfed

答案:B

根据栈的后进先出原则B选项d出栈后,c为栈顶,b不能出栈

12、用P表示进栈操作,用D表示出栈操作。进栈顺序是abcd,为了得到bcda的出栈顺序,相应的P和D的操作序列为()。
A、PDPPDPDD
B、PPPDPDDD
C、PPDDPDPD
D、PPDPDPDD

答案:D

1:P,栈中为a,

2:P,栈中为ab,

3:为得到b:D,栈中为a

4:P,栈中为ac

5:为得到c:D,栈中为a

6:P,栈中为ad

7:D,

8:D。

13、入栈顺序为P1, P2,…, Pn,出栈顺序为1,2,3,…,n,如果P3=1,则P1的值()。
A、一定是3
B、一定是2
C、可能是2
D、不可能是2

答案:D

如果P3=1,可知,P3第一个出栈,P3出栈后,栈中剩下P1P2,由出栈顺序可知,P3后一个出栈的数是2,P3后一个出栈的不可能是P1,因此P1一定不为2

14、 4 个不同元素依次进栈,能得到()种不同的出栈序列。
A、16
B、15
C、14
D、13

答案:C

枚举

15、在递归过程调用时,为了保存返回地址,实际参数和局部变量,要求使用一种称为()的数据结构。

A、队列

B、向量
C、栈
D、字符串

答案:C

16、()算法设计策略与递归技术的联系最弱。
A、回溯法
B、贪心法
C、分治法
D、减治法

答案:B

17、现有16枚外形相同的硬币,其中有一枚比真币的重量轻的假币,若采用分治法找出这枚假币,需至少比较()次。
A、6
B、5
C、4
D、3

答案:C

分治法是将一个大问题分成若干个小问题,分别解决这些小问题,最后将这些小问题的解合并起来,从而得到大问题的解。

在这里,16硬币,先8枚与8枚比较,取轻的一边,四枚四枚比较,取轻的,两两比较,一一比较,共四次

18、设一个递归算法如下:

    int func(int n){  
              if ( n == 1 || n == 2 ) return 1;  
              else return func( n – 1 ) + func( n – 2 );  
    }  

则计算func(4)时需要计算func函数(  )次。
A、6
B、5
C、4
D、3

答案:B

如图,利用类似树的结构,每个圆圈节点为计算了一次

19、对表达式求值时,使用运算数栈S来辅助计算。设S只有2个存储单元,则不会发生溢出的表达式()。
A、(a+b)/c-d
B、a-b*(c+d)
C、a*(b-c*d)
D、(a-b)*(c-d)

答案:A

关键在于式子按顺序读取,考虑乘除法和括号的优先级,栈中最多同时保存两个数据

20、一个递归算法必须包括()。
A、递归部分
B、终止条件和递归部分
C、迭代部分
D、终止条件和迭代部分

答案:B

21、已知程序如下:

    int func(int x) {
        return (x <= 0) ? func( x + 1 ) + x : 0;  
    }  
    void main() {  
        cout << func(0);  
    }  

程序运行时使用栈来保存调用过程信息。则自栈底到栈顶保存的信息依次为(   )。
A、main() -> func(1) -> func(0)
B、main() -> func(0) -> func(1)
C、func(0) -> func(1) -> main()
D、func(1) -> func(0) -> main()

答案:B

这是一个递归过程,入栈顺序为main()(先被调用没出结果),后调用了func(0)最后func(1),按顺序入栈保存

22、求整数n(n>=0)阶乘的算法如下,其时间复杂度为()。

    func(int n){
        if( n <= 1 ) return 1;            
        else return ( n * func( n – 1 ) );
    }

A、O(log2​n)
B、O(nlog2​n)
C、O(n)
D、O(n2)

答案:C

输入n后递归过程有n次

23、设栈的初始状态为空,当字符序列"mp3"作为栈的输入时,输出长度为3,且可以用作C语言标识符的序列有()个。
A、3
B、4
C、5
D、6

答案:B

c语言标识符,不能以3作为开头,除去3pm外,都能用,一共有4个(枚举,mp3,m3p,pm3,p3m)

24、元素a,b,c,d,e依次入栈。在所有可能的出栈序列中,以d开头的序列个数是()。
A、3
B、4
C、5
D、6

答案:B

d开头,则栈为abcd时,d出栈,进行枚举,其中e分别在a,b,c,左边以及c右边出栈一共有四种情况

25、将编号为0和1的两个栈存放于同一个数组空间v[m]中,栈底分别处于数组的两端。0号栈的栈顶top[0]=-1时栈空;1号栈的栈顶top[1]=m时栈空。则判断此共享栈已满的条件是()。
A、top[0]==top[1]
B、top[0]+top[1]==m
C、top[0]==top[1]+1
D、top[0]==top[1]-1

答案:D

栈底位于两端,则栈满时,两个top重合,但两个top不可能是同一个,top1>top0因此选D

26、()是队列的基本操作。
A、取出最近入队的元素
B、删除队头元素
C、在队列元素之间插入元素
D、对队列中的元素排序

答案:B

只能对队头操作

27、链式存储的队列在进行删除运算时()。
A、只需要修改尾指针
B、只需要修改头指针
C、头尾指针可能都要修改
D、头尾指针一定都要修改

答案:C

链式队列队尾元素next可能指向头节点

28、最不适合存放队列的链表是()。
A、只带队首指针的循环双链表
B、只带队尾指针的循环双链表
C、只带队首指针的普通双链表
D、只带队尾指针的循环单链表

答案:C

AB都是循环双链表,适合,D队尾指针循环单,可直接访问队尾,也可以通过next访问队头,C普通单链表带头,无法直接访问队尾

29、设栈S和队列Q的初始状态为空,元素a,b,c,d,e,f依次进入栈S,各元素出栈后即进入队列Q。若出队序列为c,e,d,f,b,a,则栈S的容量至少为()。
A、2
B、3
C、4
D、5

答案:C

出队序列即为出栈序列,栈中最长为abde,长度为4

30、数组a[0…n]用来存放循环队列,则入队时的操作是()。
A、rear = rear + 1
B、rear = (rear + 1) mod (n - 1)
C、rear = (rear + 1) mod n
D、rear = (rear + 1) mod (n + 1)

答案:D

若rear=n,入队后rear应为0,计算易得D答案

31、循环队列存放在数组Q[n]中。h指向头元素,t指向队尾元素的后一个位置。设队列中元素个数小于n,则队列中一共有()个元素。
A、t-h
B、(n+h-t)%n
C、(n+t-h)%n
D、n+t-h

答案:C

32、循环队列存放在数组a[15]中,front指向队头元素的前一个位置,rear指向队尾元素。当front=8, rear=3时,队列的长度为()。
A、5
B、6
C、10
D、11

答案:C

front指向队头元素的前一个位置,rear指向队尾元素与front指向队头元素,rear指向队尾元素的后一个位置计算长度方法相同,(r-f+n)%n,此处为(3-8+15)%15=10

33、循环队列存放在数组a[0…10]中。当前rear=3,front=9。则从队列中删除2个元素,再加入1个元素后,rear和front的值为()。
A、2和7
B、4和0
C、5和10
D、5和0

答案:B

删除2:f+2,加入1:r+1

34、循环队列存放在数组a[0…n]中。队列非空时front指向队头元素,rear指向队尾元素。初始时队列为空,要求第一个入队的元素存放在a[0]处,则front和rear的初始值为()。
A、0,0
B、0,n-1
C、0,n    
D、n,n

答案:C

队头元素为0,再次入队时,队尾加1,队头不变,因此队头初始为0,队尾每次入队要加1,当空队时应但是n(即入队一个元素后,指向和队头相同位置0)

35、链队中队头指针为front,队尾指针为rear,则将指针x指向的结点插入队列需要执行的操作是()。
A、front -> next = x; front = front -> next; x -> next = NULL
B、rear -> next = x; rear = rear -> next
C、x -> next = NULL; rear -> next = x; rear = rear -> next;
D、x -> next = rear -> next; rear = x;

答案:C

将x的next指向NULL表示结束,后将x接入rear,再讲rear指向x

36、循环队列存放在数组a[0…m]中。end1指向队头元素,end2指向队尾元素的后一个位置。设队列两端都可以进行入队出队操作,且初始时为空。则判断队空和队满的条件是()。
A、队空:end1 == end2;
队满:end1 == (end2 + 1) mod m;
B、队空:end1 == end2;
队满:end1 == (end2 + 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);

答案:B

37、某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作,若元素a,b,c,d,e依次入此队列后再进行出队操作,则不可能得到的出队序列是()。
A、b,a,c,d,e
B、d,b,a,c,e
C、d,b,c,a,e
D、e,c,b,a,d

答案:C

枚举做法

38、栈的应用不包括()。
A、递归调用
B、子程序调用
C、表达式求值
D、打印机缓冲区

答案:D

39、设有如图所示的火车车轨,入口到出口之间有n条隧道,列车的行进方向均为从左至右。列车可以驶入任意一条轨道。现有编号1-9的9辆列车,驶入次序依次是8,3,4,2,9,5,7,6,1。若期望列车驶出的顺序依次为1-9,则n至少是(    )。
,
A、2
B、3
C、4
D、5

答案:C

需要驶出序列从1开始,需要轨道数(同一条轨道中,后进的序号要大于先进的):

8进,9进

3进,4进,5进,7进

2进,6进

1进

如上四条

40、有队列Q和栈S,初始时,Q中元素从头开始依次为1,2,3,4,5,6,S为空。若仅允许以下三种操作:
(1)出队并输出出队元素
(2)出队并将出队元素入栈
(3)出栈并输出出栈元素
则不能得到的输出序列为(  )。   
A、6,5,4,3,2,1
B、2,3,4,5,6,1
C、1,2,4,3,5,6
D、4,5,6,1,2,3

答案:D

(1)(3)操作都要输出,因此,从1到6,未按顺序输出的元素可视为执行了2操作,按此进行排除,

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

D D D D C

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

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

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

打赏作者

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

抵扣说明:

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

余额充值