1.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为( )。
A.i B.n-i C.n-i+1 D.不确定
答案:C
解释:栈是后进先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,说明1,2,3,…,n一次性全部进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1。
2.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为( )。
A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n
答案:D
解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n。
3.链式栈结点为:(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
解释:x=top->data将结点的值保存到x中,top=top->link栈顶指针指向栈顶下一结点,即摘除栈顶结点。
4.设有一个递归算法如下
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=0,易知仅调用一次fact(n)函数,故选A。或者用3
5.设栈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
答案:B
解释:元素出队的序列是e2、e4、e3、e6、e5和e1,可知元素入队的序列是e2、e4、e3、e6、e5和e1,即元素出栈的序列也是e2、e4、e3、e6、e5和e1,而元素e1、e2、e3、e4、e5和e6依次进入栈,易知栈S中最多同时存在3个元素,故栈S的容量至少为3。
6.若一个栈以向量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为n+1,说明元素从数组向量的高端地址进栈,又因为元素存储在向量空间V[1..n]中,所以进栈时top指针先下移变为n,之后将元素x存储在V[n]。
7.设计一个判别表达式中左,右括号是否配对出现的算法,采用( )数据结构最佳。
A.线性表的顺序存储结构 B.队列
C. 线性表的链式存储结构 D. 栈
答案:D
解释:利用栈的后进先出原则。
8.用链接方式存储的队列,在进行删除运算时( )。
A. 仅修改头指针 B. 仅修改尾指针
C. 头、尾指针都要修改 D. 头、尾指针可能都要修改
答案:D
解释:一般情况下只修改头指针,但是,当删除的是队列中最后一个元素时,队尾指针也丢失了,因此需对队尾指针重新赋值。
9.循环队列存储在数组A[0..m]中,则入队时的操作为( )。
A. rear=rear+1 B. rear=(rear+1)%(m-1)
C. rear=(rear+1)%m D. rear=(rear+1)%(m+1)
答案:D
解释:数组A[0..m]中共含有m+1个元素,故在求模运算时应除以m+1。
10.最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是( )。
A. (rear+1)%n==front B. rear==front
C.rear+1==front D. (rear-l)%n==front
答案:B
解释:最大容量为n的循环队列,队满条件是(rear+1)%n==front,队空条件是rear==front。
11.栈和队列的共同点是( )。
A. 都是先进先出 B. 都是先进后出
C. 只允许在端点处插入和删除元素 D. 没有共同点
答案:C
解释:栈只允许在栈顶处进行插入和删除元素,队列只允许在队尾插入元素和在队头删除元素。
12.一个递归算法必须包括( )。
A. 递归部分 B. 终止条件和递归部分
C. 迭代部分 D. 终止条件和迭代部分
答案:B
13.若元素a、b、c、d、e、f依次进栈,允许进栈、退栈的操作交替进行,但不允许连续3次出栈工作,则不可能得到的出栈序列是______。
A. dcebfa
B. cbdaef
C. bcaefd
D. afedcb
答案 D
14.已知一个栈的进栈序列是1,2,3,…,n,其输出序列的第一个元素是i(1≤i≤n),则第j(1≤j≤n)个出栈元素是______。
A. i
B. n-i
C. j-i+1
D. 不确定
答案 D.不确定 (对比第一个选择题即可发现)
15.设n个元素进栈序列是1、2、3、…、n,其输出序列是p1、p2、…、pn,若p1=3,则p2的值为______。
A. 一定是2 B. 一定是1
C. 不可能是1 D. 以上都不对
答案 C 虽然第一个出列是3,但是第二个出列的可能是2或者刚好入队一个那就是4,但是绝对不可能是1
16.设n个元素进栈序列是1、2、3、…、n,其输出序列是p1、p2、…、pn,若p2=3,则p3的可能取值的个数为______。
A.n-2 B.n-3
C.n-1 D无法确定
答案 C.(只从顶端出栈,p1能为2,p2=3,但是p3可以为1,4,5,6,7,......n)
17.由两个栈共享一个数组空间的好处是______。
A. 减少存取时间,降低上溢出发生的机率
B. 节省存储空间,降低上溢出发生的机率
C. 减少存取时间,降低下溢出发生的机率
D. 节省存储空间,降低下溢出发生的机率
答案 B
18.算术表达式(a+a*b)*a+c*b/a的后缀表达式是______。
A. a a b * + a * c b * a / +
B. a a * b + a * c b * a / +
C. a a b * a * c b * + a / +
D. a a b * + a c b * a / + *
答案 A. a a b * + a * c b * a / +(左右符号)
19.将算术表达式“1+6/(8-5)*3”转换成后缀表达式,在求后缀表达式的过程中,当遇到'*'时,运算数栈(从栈顶到栈底次序)为______。
A. 8 6 1
B. 5 8 1
C. 3 2 1
D. 3 6 1
答案 321
20.当用一个数组data[0..n-1]存放栈中元素时,栈底最好______。
A. 设置在data[0]处
B. 设置在data[n-1]处
C. 设置在data[0]或data[n-1]处
D. 设置在data数组的任何位置
答案 C. 设置在data[0]或data[n-1]处
21.若一个栈元素用数组data[1..n]存储,初始栈顶指针top为n,则以下元素x进栈最适合的操作是______。
A. top++; data[top]=x;
B. data[top]=x; top++;
C. top--; data[top]=x;
D. data[top]=x; top--;
答案:D ['data[top]=x; top--;'] (33题 40题)
22.若一个栈元素用数组data[1..n]存储,初始栈顶指针top为n,则以下出栈元素x最适合的操作是______。
A. x=data[top]; top++;
B. top++; x=data[top];
C. x=data[top]=x; top--;
D. top--; x=data[top];
答案 B. top++; x=data[top];(参考40题 该数组将栈顶放在了下标大的一端)
23.若一个栈元素用数组data[1..n]存储,初始栈顶指针top为0,则以下元素x进栈最适合的操作是______。
A. top++; data[top]=x;
B. data[top]=x; top++;
C. top--; data[top]=x;
D. data[top]=x; top--;
答案 top++; data[top]=x;
24.若一个栈元素用数组data[1..n]存储,初始栈顶指针top为0,则以下出栈元素x最适合的操作是______。
A. x=data[top]; top--;
B. x=data[top]; top++;
C. top--; x=data[top];
D. top++; x=data[top];;
答案 x=data[top]; top--;
25.有关链栈的叙述中正确的是______。
A. 链栈在进栈操作时一般不需要考虑上溢出
B. 链栈在出栈操作时一般不需要考虑下溢出
C. 链栈和顺序栈相比的缺点是不能随机访问栈中元素
D. 以上都不对
答案 B. 链栈在出栈操作时一般不需要考虑下溢出
26.以下各链表均不带有头结点,其中最不适合用作链栈的链表是______。
A. 只有表头指针没有表尾指针的循环双链表
B. 只有表尾指针没有表头指针的循环双链表
C. 只有表尾指针没有表头指针的循环单链表
D. 只有表头指针没有表尾指针的循环单链表
答案 D 只有表头指针没有表尾指针的循环单链表
27.栈和队列的不同点是______。
A. 都是线性表
B. 都不是线性表
C. 栈只能在同一端进行插入删除操作,而队列在不同端进行插入删除操作
D. 没有不同点
答案 C栈只能在同一端进行插入删除操作,而队列在不同端进行插入删除操作
28.某循环队列的元素类型为char,队头指针front指向队头元素的前一个位置,队尾指针rear指向队尾元素,如图1.6所示,则队中从队头到队尾的元素为______。
A. abcd123456
B. abcd123456c
C. dfgbca
D. cdfgbca
答案 C
29.已知循环队列存储在一维数组A[0..n-1]中,且队列非空时front和rear分别指向队头元素和队尾元素。若初始时队列空,且要求第一个进入队列的元素存储在A[0]处,则初始时front和rear的值分别是______。
A. 0,0
B. 0,n-1
C. n-1,0
D. n-1,n-1
答案 B 0,n-1(插入一个元素后再A[0],插入元素队头指针不变,可判定队头指针是0,但是根据对位指针公式(rear+1)%n=0知道插入之前rear=n-1)
30.设循环队列qu中数组data的下标是0~N-1,其队头、队尾指针分别为f和r(f指向队首元素的前一位置,r指向队尾元素),元素x出队的操作是______ ; x=qu.data[qu.f]。
A. qu.r++
B. qu.r=(qu.r+1)%N
C. qu.f++;
D. qu.f=(qu.f+1)%N
答案 D qu.f=(qu.f+1)%N
31.若栈采用顺序存储方式存储,现两栈共享空间V[1…m],top[i]代表第i个栈( i =1,2)栈顶(该位置不存储对应栈数据),栈1的底在v[1],栈2的底在V[m],则栈满的条件是( )。
B. top[1]-1=top[2]
32.若top为指向栈顶元素的指针,判定栈S(最多容纳m个元素)为空的条件是:
答案 B S->top==-1
(通常,当栈存在一个元素时,top等于0,因此通常把空栈的判定条件定为top等于-1。注意:若栈顶top初始化为0,则指向栈顶元素的下一个位置,对此相应的定义操作也会变化。此处top初始化为-1。)
33.利用大小为n的数组(下标从0到n-1)存储一个栈时,假定栈从数组另一头开始且top==n表示栈空,则向这个栈插入一个元素时,修改top指针应当执行:
C. top–(因为top==n表示栈空,不是0表示,如果是0,那就是top++了)
34.若用大小为6的数组来实现循环队列,且当前front和rear的值分别为0和4。当从队列中删除两个元素,再加入两个元素后,front和rear的值分别为多少?
2和0(因为数组下标从0开始一直到5,大小就为6,然后删除两个,删除一个f++到1,在删除一个,f++到2,然后增加两个,先增加一个到数组下标为4的位置,r++到5,在增加一个到5的位置,r++到数组下标为0的位置了)
35.如果循环队列用大小为m的数组表示,且用队头指针front和队列元素个数size代替一般循环队列中的front和rear指针来表示队列的范围,那么这样的循环队列可以容纳的元素个数最多为:
m
36.如果循环队列用大小为m的数组表示,队头位置为front、队列元素个数为size,那么队尾元素位置rear为
A.(front+size-1)%m
37.在一个顺序存储的循环队列中,若队尾指针指向队尾元素的后一个位置,则队头指针一般指向队头元素的( )。
当前位置 (后面是虚位以待,所以前面是实位以待。)
38.设C语言数组Data[m+1]作为循环队列SQ的存储空间, front为队头指针,rear为队尾指针,则执行出队操作的语句为( )。
front=(front+1)%(m+1) {data[m+1]中有m+1个元素}
39.链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作( )。
x=top->data,top=top->link(这里不带头结点,可参考笔记带头结点这里link相当于next,就不修改了,即x=top->next->data,top->next=top->next->link)
40.若一个栈以向量V[1…n]存储,初始栈顶指针top设为n+1,则元素x进栈的正确操作是( )。
top–,V[top]=x (栈式运算受限的线性表,只允许在栈顶进行插入和删除操作。本题中栈顶指针为n+1,该数组将栈顶放在了下标大的一端,所以在进行入栈操作时top指针应该进行减一操作。)
41.循环队列存储在A[0…m]中,则入队时的操作是____
rear=(rear+1)%(m+1) {此类题一定要切记看有多少个元素,这道题从0到m一共m+1个元素}
42.循环队列存储在A[0…m]中,则入队时的操作是____
rear=(rear+1)%(m+1) {此题元素个数为m+1个 }
43.表达式3*2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为( ),其中^为乘幂 。
3, 2, 8; * ^ ( -
1.所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。
错 将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。因此,循环队列是一个抽象的数据结构,而单向循环链表或循环数组是具体的实现方式,不是数据结构本身。
2.循环队列也存在着空间溢出问题。
对
3.循环队列执行出队操作时会引起大量元素的移动。
错
4.n个元素进队的顺序和出队的顺序总是一致的。
对 (先进者先出,就是"队列" 我们可以想象成,排队买票,先来的先买,后来的只能在末尾,不允许插队。
队列的两个基本操作:入队 将一个数据放到队列尾部;出队 从队列的头部取出一个元素。
队列也是一种操作受限的线性表数据结构 它具有先进先出的特性,支持队尾插入元素,在队头删除元素。)
队列
用静态数组存放数据元素
循环队列:用模运算取余(将无限的整数域映射到有限的整数集合)
将线状存储空间逻辑上变成环状
一,队尾指针指向队尾元素的下一个位置
初始化:q.front=q.rear=0
入队:q.data【q.rear】=x;
q.rear=(q.rear+1)%maxsize;
出队:x=q.data【q.front】
q.front=(q.front+1)%maxsize
队列长度:(q.rear-q.front+maxsize)%maxsize
(1)牺牲一个存储单元条件下判断队列的空满
判断空:q.front=q.rear
判断满:(q.rear+1)%maxsize==q.front
(2)设置一个size判断空满
判空:size=0&&q.front=q.rear
判满:size=maxsize&&q.front=q.rear
(3)设置一个tag
判空:tag=0&&q.front=q.rear
判满:tag=0&&q.front=q.rear
二,队尾指针指向队尾元素
初始化:q.front=0 ,q.rear=n-1
入队:q.rear=(q.rear+1)%maxsize
q.data【q.rear】=x
出队:和队尾指针指向队尾下一个因素的代码一样
队列长度:(q.rear-q.front-1+maxsize)%maxsize
(1)牺牲一个存储单元判空满
判空:队头指针在队尾指针的下一个位置
判满:对头指针在队尾的下下一个位置
(2)设置一个size
判空:size=0&&队头指针在队尾指针的下一个位置
判满:size=maxsize&&队头指针在队尾的下下一个位置
(3)设置一个tag
判空:tag=0&&队头指针在队尾的下一个位置
判满:tag=1&&队头指针在队尾的下下一个位置