数据结构练习 第三章 栈和队列Word下载.docx
《数据结构练习 第三章 栈和队列Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构练习 第三章 栈和队列Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
8.队列是一种()的线性表。
A.先进先出B.先进后出C.只能插入D.只能删除
9.设输入序列1、2、3、…、n经过栈作用后,输出序列中的第一个元素是n,则输出序列中的第i个输出元素是()。
A.n-iB.n-1-iC.n+l-iD.不能确定
10.设输入序列为1、2、3、4、5、6,则通过栈的作用后可以得到的输出序列为()。
A.5,3,4,6,1,2B.3,2,5,6,4,1
C.3,1,2,5,4,6D.1,5,4,6,2,3
11.队列的删除操作是在()进行。
A.队首B.队尾C.队前D.队后
12.当利用大小为N的数组顺序存储一个栈时,假定用top==N表示栈空,则退栈时,用()语句修改top指针。
A.top++;
B.top=0;
C.top--;
D.top=N;
13.队列的插入操作是在()进行。
A.队首B.队尾C.队前D.队后
14.若已有一个栈,输入序列为A,B,C,D,E,那么下面哪种序列不可能得到?
()
A.ABCDEB.EDCBAC.BAEDCD.ECDBA
(d)注意:
入栈和出栈操作可以交替进行,因此就可能有多种输出序列了。
15.栈和队列共同具有的特点是( )
A.都是先进后出B.都是先进先出
C.只允许在端点进行操作运算D.既能先进先出,也能先进后出
16.若用一个有6个单元的数组来实现循环队列,rear和front的初值分别为0和3。
则从队列中删除一个元素,再添加两个元素后,rear和front的值分别为( )
A.1和5B.2和4C.4和2D.5和1
17.一个栈的入栈序列是a,b,c,d,e,则栈的输出序列不可能是()
A.dceabB.decbaC.edcbaD.abcde
18.元素大小为1个单元,容量为n个单元的非空顺序栈中,以地址高端为栈底,以top作为栈顶指针,则出栈处理后,top的值应修改为()
A.top=topB.top=n-1C.top=top-1D.top=top+1
19.设有一个栈,按A、B、C、D的顺序进栈,则可能为出栈序列的是()
A.DCBAB.CDABC.DBACD.DCAB
20.在一个具有n个单元的顺序栈中,假定以地址低端(即0单元)作为栈底,以top为栈顶指针,则当做出栈处理时,top变化为()
A.top++B.top--C.top不变D.top=0
21.关于栈和队列的说法中正确的是()
A.栈和队列都是线性结构
B.栈是线性结构,队列不是线性结构
C.栈不是线性结构,队列是线性结构
D.栈和队列都不是线性结构
22.设一个栈的输入序列是a,b,c,d,则所得到的输出序列(输入过程中允许出栈)不可能出现的是()
A.a,b,c,dB.a,b,d,c
C.d,c,b,aD.c,d,a,b
23.在具有m个单元的循环队列中,队头指针为front,队尾指针为rear,则队满的条件是()
A.front==rearB.(front+1)%m==rear
C.rear+1==frontD.(rear+1)%m==front
24.循环队列存储在数组A[0..m]中,则入队时的操作为(D)。
A.rear=rear+1B.rear=(rear+1)%(m-1)
C.rear=(rear+1)%mD.rear=(rear+1)%(m+1)
25.顺序栈S中top为栈顶指针,指向栈顶元素所在的位置,elem为存放栈的数组,则元素e进栈操作的主要语句为( )
A.s.elem[top]=e;
B.s.elem[top+1]=e;
s.top=s.top+1;
s.top=s.top+1;
C.s.top=s.top+1;
D.s.top=s.top+1;
s.elem[top+1]=e;
s.elem[top]=e;
26.循环队列sq中,用数组elem[0·
·
25]存放数据元素,sq.front指示队头元素的前一个位置,sq.rear指示队尾元素的当前位置,设当前sq.front为20,sq.rear为12,则当前队列中的元素个数为( )
A.8B.16C.17D.18
27.有关栈的描述,正确的是( )
A.栈是一种先进先出的特殊的线性表
B.只能从栈顶执行插入、删除操作
C.只能从栈顶执行插入、栈底执行删除
D.栈顶和栈底均可执行插入、删除操作
28.设顺序循环队列Q[0:
M-1]的头指针和尾指针分别为F和R,头指针F总是指向队头元素的前一位置,尾指针R总是指向队尾元素的当前位置,则该循环队列中的元素个数为()。
A.R-FB.F-RC.(R-F+M)%MD.(F-R+M)%M
29.设一数列的输入顺序为1,2,3,4,5,6,通过栈操作不可能排成的输出序列为()。
A.3,2,5,6,4,1B.1,5,4,6,2,3
C.2,4,3,5,1,6D.4,5,3,6,2,1
30.设有一个栈,元素的进栈次序为A,B,C,D,E,则下列()是不可能的出栈序列。
A.A,B,C,D,EB.B,C,D,E,A
C.E,A,B,C,DD.E,D,C,B,A
31.在具有N个单元的顺序存储循环队列中,假定front和rear分别为对头指针和对尾指针,则判断对满的条件为()。
A.front==rearB.(rear+1)%MAXSIZE==front
C.front-rear==1D.rear%MAXSIZE==front
32.一个元素进入队列的时间复杂度是()。
A.O
(1)B.O(n)C.O(n2)D.O(log2n)
33.若让元素1,2,3依次进栈,则出栈次序不可能出现()种情况。
A.3,2,1B.2,1,3
C.3,1,2D.1,3,2
34.假定一个链队的队首和队尾指针分别为front和rear,则判断队空的条件是()。
A.front==NULLB.front!
=NULL
C.rear!
=NULLD.front==rear
35.若让元素a,b,c依次进栈,则出栈次序不可能出现()种情况。
A.cbaB.bacC.cabD.acb
36.在一个链队列中,假定front和rear分别为队头和队尾指针,则插入*s结点的操作应执行()。
A.front->
next=s;
front=s;
B.s->
next=rear;
rear=s;
C.rear->
D.s->
next=front;
37.栈的插入与删除操作在()进行。
A.栈顶B.栈底C.任意位置D.指定位置
38.当利用大小为N的一维数组顺序存储一个栈时,假定用top=-1表示栈空,则向这个栈插入一个元素时,首先应执行()语句修改top指针。
A.top++;
B.top--;
C.top=NULL;
D.top;
39.当采用顺序存储方式存储队列时,可能出现存储空间剩余,而不允许继续入队的情况,称为()。
A.溢出B.假溢出C.队列不能用顺序存储方式D.数组存储空间过小
40.当利用大小为N的一维数组顺序存储一个循环队列时,该队列的最大长度为()。
A.N-2B.N-1C.ND.N+1
41.从一个循环顺序队列删除元素时,首先需要()。
A.前移一位队首指针B.后移一位队首指针
C.取出队首指针所指位置上的元素D.取出队尾指针所指位置上的元素
42.循环队列存储在数组A[0..m]中,则入队时的操作为()。
A.rear=rear+1B.rear=(rear+1)%(m-1)
C.rear=(rear+1)%mD.rear=(rear+1)%(m+1)
43.4个园盘的Hahoi塔,总的移动次数为()。
A.7B.8C.15D.16
44.对于栈操作数据的原则是()。
A.先进先出B.后进先出C.后进后出D.不分顺序
45.有六个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列?
A.543612B.453126C.346521D.234156
46.设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。
A.1,2,4,3,B.2,1,3,4,C.1,4,3,2,
D.4,3,1,2,E.3,2,1,4,
47.如进栈序列1,2,3,4,5。
可能得到的出栈序列为()
A.1,2,5,3,4B.3,1,2,5,4C.3,2,5,4,1D.1,4,2,3,5E.都不可能
48.一个栈的入栈序列为A,B,C,D,E,则栈的不可能的出栈序列是()。
A.ABCDEB.EDCBAC.DECBAD.DCEAB
49.functioncalc(x,y:
integer):
integer;
begin
ify=1thencalc:
=x
elsecalc:
=calc(x,y-1)+x
end;
a,b均为正整数,则calc(a,b)=()
A.a*(b-1)B.a*bC.a+bD.a+a
50.执行完下列语句段后,i值为:
()。
intf(intx)
{return((x>
0)?
x*f(x-1):
2);
}
inti;
i=f(f
(1));
A.2B.4C.8D.无限递归
51.表达式a*(b+c)-d的后缀表达式是()。
A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd
52.允许对队列进行的操作有()。
C.在队头元素之前插入元素D.删除队头元素
53.用不带头结点的单链表存储队列,其队头指针指向队头结点,队尾指针指向队尾结点,则在进行出队操作时()
A.仅修改队头指针B.仅修改队尾指针
C.队头,队尾指针都可能要修改D.队头,队尾指针都要修改
54.对于循环队列()。
A.无法判断队列是否为空B.无法判断队列是否为满
C.队列不可能满D.以上说法都不是
55.循环队列A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是()。
A.(rear-front+m)%mB.rear-front+1
C.rear-front-1D.rear-front
56.若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?
A.1和5B.2和4C.4和2D.5和1
57.栈和队的共同点是()。
A.都是先进后出B.都是后进先出
C.只允许在端点处插入和删除元素D.没有共同点
58.设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是()。
A.6B.4C.3D.2
59.4个园盘的Hahoi塔,总的移动次数为().
A.7B.-8C.15D.16
60.和顺序栈相比,链栈有一个比较明显的优势是()。
A.通常不会出现栈满的情况B.通常不会出现栈空的情况
C.插入操作更容易实现D.删除操作更容易实现
61.执行()操作时,需要使用队列作辅助存储空间。
A.
查找哈希(Hash)表B.广度优先搜索网
C.先序(根)遍历二叉树D.深度优先搜索网
62.设有一顺序栈已经含有3个元素,如图3.1所示元素a4正等待进栈。
下列不可能出现的出栈序列是(A)
A.a3,a1,a4,a2B.a3,a2,a4,a1
C.a3,a4,a2,a1D.a4,a3,a2,a1
a1
a2
Top
a3
63.在一个链队中,若f,r分别为队首、队尾指针,则插入s所指结点的操作为(B)
A.f->
f=s;
B.r->
r=s;
C.s->
next=r;
D.s->
next=f;
64.若用一个大小为6的数组来实现循环队列,且当rear和front的值分别是0和3。
当从队列中删除一个元素,再加入两个元素后,rear和front的值分别是(A)
A.2和4B.1和5C.4和2D.5和1
65.有六个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列?
(C)
A.543612B.453126C.346521D.234156
二、填空题
1.后缀算式923+-102/-的值为__________。
中缀算式(3+4X)-2Y/3对应的后缀算式为___________________________。
-1,34X*+2Y*3/-
2.下面程序段的功能实现数据x进栈,要求在下划线处填上正确的语句。
typedefstruct{ints[100];
inttop;
}sqstack;
voidpush(sqstack&
stack,intx)
{
if(stack.top==m-1)printf(“overflow”);
else{____________________;
_________________;
}stack.top++,stack.s[stack.top]=x
3.设输入序列为1、2、3,则经过栈的作用后可以得到___________种不同的输出序列。
5
4.不论是顺序存储结构的栈还是链式存储结构的栈,其入栈和出栈操作的时间复杂度均为____________。
O
(1)
5.设有一个顺序循环队列中有M个存储单元,则该循环队列中最多能够存储________个队列元素;
当前实际存储________________个队列元素(设头指针F指向当前队头元素的前一个位置,尾指针指向当前队尾元素的位置)。
m-1,(R-F+M)%M
6.设有一个顺序共享栈S[0:
n-1],其中第一个栈项指针top1的初值为-1,第二个栈顶指针top2的初值为n,则判断共享栈满的条件是____________________。
top1+1=top2
7.栈的插入和删除只能在栈的栈顶进行,后进栈的元素必定先出栈,所以又把栈称为__________表;
队列的插入和删除运算分别在队列的两端进行,先进队列的元素必定先出队列,所以又把队列称为_________表。
FILO,FIFO
8.设某顺序循环队列中有m个元素,且规定队头指针F指向队头元素的前一个位置,队尾指针R指向队尾元素的当前位置,则该循环队列中最多存储_______队列元素。
m-1
9.设F和R分别表示顺序循环队列的头指针和尾指针,则判断该循环队列为空的条件为_____________________。
F==R
10.从一个栈删除元素时,首先取出,然后再前移一位。
栈顶元素、栈顶指针
11.后缀表达式“210+5*6–9/”的值为。
6
12.中缀表达示3+X*(2.4/5-6)所对应的后缀表达示为______________。
3x2.45/6-*+
13.用S表示入栈操作,X表示出栈操作,若元素入栈顺序为1234,为了得到1342的出栈顺序,相应的S和X操作串为__SXSSXSXX______。
14.在循环队列中,存储空间为0~n-1,设队头指针front指向队头元素前一个空闲元素,队尾指针指向队尾元素,那么队满标志为front=(rear+1)%n,队空标志为__front=rear______。
15.对于栈只能在___栈顶位置_____插入和删除元素。
16.设输入元素的顺序是A,B,C,D,通过栈的变换,在输出端可得到各种排列。
若输出序列的第一个元素为D,则输出序列为__DCBA_____________。
17.队列中允许进行删除的一端为____队头___________。
18.我们通常把队列中允许插入的一端称为________队尾________。
19.队列的原则是。
先进先出;
20.顺序存储的队列如果不采用循环方式,则会出现问题。
假溢出
21.栈的原则是。
先进后出。
22.对于一个顺序栈作进栈运算时,应先判断栈是否为,判断的条件是,作出栈运算时,应先判断栈是否为,判断的条件是。
满;
top==MAXSIZE-1;
空;
top==-1。
23.在长度为Maxsize的循环队列中,删除一个新元素,修改front队头指针为。
front=(front+1)/Maxsize
24.在链队列中,与入队相关的指针是、与出队有关的指针是(头指针或尾指针)。
尾指针、头指针
25.当用长度为N的一维数组顺序存储一个栈时,假定用top==N表示栈空,则表示栈满的条件为。
top==0
26.向一个栈顶指针为HS的链栈中插入一个新结点*P果,应执行和
操作。
p->
next=HS、HS=p
27.从一个栈顶指针为HS的非空链栈中删除结点并不需要返回栈顶结点的值和回收结点时,应执行操作。
HS=HS->
next
28.假定front和rear分别为一个链队的队首和队尾指针,则该链队中只有一个结点的条件为。
(front==rear)&
&
(front<
>
NULL)
29.中缀算术表达式3+4/(25-(6+15))*8所对应的后缀算术表达式为。
3425615+-/8*+
30.后缀算术表达式248+3*4107-*/所对应的中缀算术表达式为,值为。
(24+8)*3/(4*(10-7))、8
31.在一个具有n个单元的顺序栈中,假定以地址高端(即下标为n的单元)作为栈底,以top作为栈顶指针,则当向栈中压入一个元素时,top的变化是top=_____。
top-1
32.在作进栈运算时应先判别栈是否_
(1)_;
在作退栈运算时应先判别栈是否_
(2)_;
当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为_(3)_。
为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的空间时,应将两栈的_(4)_分别设在内存空间的两端,这样只有当_(5)_时才产生溢出。
(1)满
(2)空(3)n(4)栈底(5)两栈顶指针相邻(即值之差的绝对值为1)
33.多个栈共存时,最好用_______作为存储结构。
链式存储结构
34.顺序栈用data[1..n]存储数据,栈顶指针是top,则值为x的元素入栈的操作是_______。
if(top!
=n)data[++top]=x;
35.循环队列的引入,目的是为了克服_______。
假溢出时大量移动数据元素。
36.设a=6,b=4,c=2,d=3,e=2,则后缀表达式abc-/de*+的值为____。
9
37.在循环队列中,队列长度为n,存储位置从0到n-1编号,以rear指示实际的队尾元素,现要在此队列中插入一个新元素,新元素的位置是()。
rear=(rear+1)%n
38.已知链队列的头尾指针分别是f和r,则将值x入队的操作序列是_______。
s=(LNode*)malloc(sizeof(Lnode));
s->
data=x;
s->
next=r->
next;
r->
r=s;
39.区分循环队列的满与空,只有两种方法,它们是______和______。
牺牲一个存储单元设标记
40.已知一循环队列的存储空间为[m..n],其中n>m,队头和队尾指针分别为front和rear,则此循环队列判满的条件是()(rear+1)%(n-m+1)==front
41.设有元素序列的入栈次序为:
(a1,a2,…,an),其出栈的次序为(ap1,ap2…,apn)现已知pl=n,则pi=____。
n-i+1
42.用循环链表表示的队列长度为n,若只设头指针,则出队和入队的时间复杂度分别是____和____;
若只设尾指针,则出队和入队的时间复杂度分别是____和____。
O
(1),O(n),O
(1),O
(1)
43.下面程序的功能是用递归算法将一个整数按逆序存放到一个字符数组中。
如123存放成321。
请填空:
#include<
stdio.h>
voidconvert(char*a,intn)
{inti;
if(i=n/10)convert(______,i);
*a=__________;
main()
{intnumber;
charstr[10]=””;
scanf(“%d”,&
number);
convert(str,number);
puts(str);
}a+1n%10
44.写出下面程序的运行结果
programpriout(input