一.判断题
栈是一种特殊的线性表,它的插入和删除操作都是在表的同一端进行。 T
队列中允许插入的一端叫队头,允许删除的一端叫队尾。 F
队列结构的顺序存储会产生假溢出现象。T
若一个栈的输入序列为{1, 2, 3, 4, 5},则不可能得到{3, 4, 1, 2, 5}这样的出栈序列。T
栈顶元素和栈底元素有可能是冋一个元素。T
在一个只包含一个元素的栈中,这个元素即是最后入栈的元素,也是最先入栈的元素,因此它既是栈顶元素,也是栈底元素。
队列中允许插入的一端叫队头,允许删除的一端叫队尾 F
在队列中,允许插入的一端通常被称为队尾(rear),允许删除的一端通常被称为队头(front)。
在n个元素连续进栈以后,它们的出栈顺序和进栈顺序一定正好相反。T
通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。输出的序列为:123。F
正确的应为:231,push 输入元素,pop删除栈顶元素
栈底元素是不能删除的元素。 F
循环队列执行出队操作时会引起大量元素的移动。 F
栈和队列的存储方式,既可以是顺序方式,也可以是链式方式。T
在用数组表示的循环队列中,front值一定小于等于rear值。F
顺序栈中元素值的大小是有序的。F
若一个栈的输入序列为1,2,3,…,N,输出序列的第一个元素是i,则第j个输出元素是j−i−1。F
链栈的插入在栈顶,删除在栈底。F
所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。F
将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。因此,循环队列是一个抽象的数据结构,而单向循环链表或循环数组是具体的实现方式,不是数据结构本身。
二.单选题
1.若用大小为6的数组来实现循环队列,且当前front
和rear
的值分别为0和4。当从队列中删除两个元素,再加入两个元素后,front
和rear
的值分别为多少?
A.2和0
B.2和4
C.2和2
D.2和6
*此处为循环队列
删除元素时:front = (front + x(为删除元素的个数)+ 队列长度)%队列长度,rear不变
增加元素时:rear = (rear + x(增加元素的的个数)+ 队列长度)%队列长度,front不变
2.若元素a、b、c、d、e、f依次进栈,允许进栈、退栈操作交替进行,但不允许连续三次进行退栈工作,则不可能得到的出栈序列是?
A.b c a e f d
B.d c e b f a
C.c b d a e f
D.a f e d c b
3.若top
为指向栈顶元素的指针,判定栈S
(最多容纳m
个元素)为空的条件是:
A.S->top != m-1
B.S->top == m-1
C.S->top == 0
D.S->top == -1
4.给定一个堆栈的入栈序列为{ 1, 2, ⋯, n },出栈序列为{ p1, p2, ⋯, pn }。如果p2=n,则存在多少种不同的出栈序列?
A.2
B.n−1
C.n
D.1
解析:p2=n,即第二个出栈的数据元素是n,那么第一个出栈的数据元素则可以是{1,2,⋯,n-1}中的任何一个,所以存在的不同的出栈序列一种有n-1种。
5.循环顺序队列中是否可以插入下一个元素()。
A.只与数组大小有关,与队首指针和队尾指针的值无关
B.只与队尾指针的值有关,与队头指针的值无关
C.与曾经进行过多少次插入操作有关
D.与队头指针和队尾指针的值有关
6.若栈采用顺序存储方式存储,现两栈共享空间V[m]
:top[i]
代表第i
(i
=1或2)个栈的栈顶;栈1的底在V[0]
,栈2的底在V[m-1]
,则栈满的条件是:
A.top[1]+top[2]==m
B.top[1]+1==top[2]
C.top[1]==top[2]
D.top[2]-top[1]|==0
7.为解决计算机主机与打印机之间速度不匹配问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是?
A.堆栈
B.图
C.队列
D.树
该缓冲区的逻辑结构通常为先进先出(FIFO)队列,也称为缓冲队列。主机将要输出的数据依次写入队列的尾部,而打印机则从队列的头部依次取出数据进行打印。这种缓冲区结构可以保证数据的顺序性,并且可以避免数据丢失或重复打印等问题。同时,由于队列具有先进先出的特点,可以有效地解决速度不匹配的问题。
8.在一个不带头结点的非空链式队列中,假设f和r分别为队头和队尾指针,则插入s所指的结点运算是
A.s->next=s; r=s;
B.f->next=s; f=s;
C.s->next=f; f=s;
D.r->next=s; r=s;
9.如果循环队列用大小为m
的数组表示,且用队头指针front
和队列元素个数size
代替一般循环队列中的front
和rear
指针来表示队列的范围,那么这样的循环队列可以容纳的元素个数最多为:
A.m+1
B.不能确定
C.m
D.m-1
有了size后就不必留一个空间表示队列满了,所以答案为m。
正常来讲,front == rear 既可以表示只有一个元素,或者满元素。所以如果没有size的话,答案应该是m-1。有了size,只需根据数组大小来判断元素个数。
10.某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作。若元素a、b、c、d、e依次入此队列后再进行出队操作,则不可能得到的出队序列是:
A.d b a c e
B.e c b a d
C.b a c d e
D.d b c a e
a选项:b a c d e☞左入a,右入b,左入c,左入d,左入e。出队端为右端(或者整个完全相反也可以。)
b选项:d b a c e☞左入a,右入b,左入c,右入d,左入e。出队端为右端(或者整个完全相反也可以。)
d选项:e c b a d☞左入a,左入b,左入c,右入d,左入e。出队端为左端(或者整个完全相反也可以。
但是C选项中出队顺序是d,b,c,a,e从左出队,从左右入队,那么a入右,b入左,c不可能在a和b的中间,因此C选项的出队顺序是错误的 ,不管怎样ab是挨在一起出队的
————————————————
版权声明:本文为优快云博主「Anagnahs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_42202174/article/details/88912760
11.如果循环队列用大小为m
的数组表示,队头位置为front
、队列元素个数为size
,那么队尾元素位置rear
为:
A.(front+size)%m
B.(front+size-1)%m
C.front+size
D.front+size-1
12.
已知初始为空的队列 Q 的一端仅能进行入队操作,另外一端既能进行入队操作又能进行出队操作。若 Q 的入队序列是 1、2、3、4、5,则不能得到的出队序列是:
A.4、2、1、3、5
B.5、4、3、1、2
C.5、3、1、2、4
D.4、1、3、2、5
13.令P代表入栈,O代表出栈。若利用堆栈将中缀表达式3*2+8/4
转为后缀表达式,则相应的堆栈操作序列是:
A.POPPOO
B.PPOOPO
C.POPOPO
D.PPPOOO
- 初始化一个空堆栈和一个空列表,用于存储转换后的后缀表达式。
- 从左到右遍历中缀表达式的每个元素,依次为:3、*、2、+、8、/、4。
- 因为3是一个数字,所以将其添加到列表的末尾。
- " * "是运算符,因此比较其与堆栈顶部元素(如果有)的优先级,并将其压入堆栈。
- 2是一个数字,将其添加到列表的末尾。
- "+"是运算符,因为比" * "的优先级低,所以弹出堆栈中的" * ",将其添加到列表的末尾。然后将"+"压入堆栈。
- 8是一个数字,将其添加到列表的末尾。
- "/"是运算符,因为比"+"的优先级高,所以将其压入堆栈。
- 4是一个数字,将其添加到列表的末尾。
- 处理完中缀表达式后,因为堆栈中还有元素,所以依次弹出"/"和"+",并将它们添加到列表的末尾。最终得到的列表为:[3, 2, *, 8, 4, /, +]
14.假设有5个整数以1、2、3、4、5的顺序被压入堆栈,且出栈顺序为3、5、4、2、1,那么为了获得这样的输出,堆栈大小至少为:
A.3
B.5
C.2
D.4
15. 有六个元素以6、5、4、3、2、1的顺序进栈,问哪个不是合法的出栈序列?
A.5 4 3 6 1 2
B.4 5 3 1 2 6
C.2 3 4 1 5 6
D.3 4 6 5 2 1
16.表达式a*(b+c)-d
的后缀表达式是:
A.a b c d * + -
B.a b c * + d -
C.- + * a b c d
D.a b c + * d -
17.设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是?
A.4 5 1 3 2
B.5 1 2 3 4
C.4 3 1 2 5
D.3 2 1 5 4
18.设栈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.4
D.3