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(log2n)
B、O(nlog2n)
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操作,按此进行排除,