数据结构-栈和队列

选择题

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&&队头指针在队尾的下下一个位置


 

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值