数据结构第三章第四章.docx

上传人:b****5 文档编号:8796063 上传时间:2023-05-15 格式:DOCX 页数:58 大小:121.90KB
下载 相关 举报
数据结构第三章第四章.docx_第1页
第1页 / 共58页
数据结构第三章第四章.docx_第2页
第2页 / 共58页
数据结构第三章第四章.docx_第3页
第3页 / 共58页
数据结构第三章第四章.docx_第4页
第4页 / 共58页
数据结构第三章第四章.docx_第5页
第5页 / 共58页
数据结构第三章第四章.docx_第6页
第6页 / 共58页
数据结构第三章第四章.docx_第7页
第7页 / 共58页
数据结构第三章第四章.docx_第8页
第8页 / 共58页
数据结构第三章第四章.docx_第9页
第9页 / 共58页
数据结构第三章第四章.docx_第10页
第10页 / 共58页
数据结构第三章第四章.docx_第11页
第11页 / 共58页
数据结构第三章第四章.docx_第12页
第12页 / 共58页
数据结构第三章第四章.docx_第13页
第13页 / 共58页
数据结构第三章第四章.docx_第14页
第14页 / 共58页
数据结构第三章第四章.docx_第15页
第15页 / 共58页
数据结构第三章第四章.docx_第16页
第16页 / 共58页
数据结构第三章第四章.docx_第17页
第17页 / 共58页
数据结构第三章第四章.docx_第18页
第18页 / 共58页
数据结构第三章第四章.docx_第19页
第19页 / 共58页
数据结构第三章第四章.docx_第20页
第20页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构第三章第四章.docx

《数据结构第三章第四章.docx》由会员分享,可在线阅读,更多相关《数据结构第三章第四章.docx(58页珍藏版)》请在冰点文库上搜索。

数据结构第三章第四章.docx

数据结构第三章第四章

第3章栈和队列

一选择题

1.对于栈操作数据的原则是()。

A.先进先出B.后进先出C.后进后出D.不分顺序

2.在作进栈运算时,应先判别栈是否(①),在作退栈运算时应先判别栈是否(②)。

当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③)。

为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的(④)分别设在这片内存空间的两端,这样,当(⑤)时,才产生上溢。

①,②:

A.空B.满C.上溢D.下溢

③:

A.n-1B.nC.n+1D.n/2

④:

A.长度B.深度C.栈顶D.栈底

⑤:

A.两个栈的栈顶同时到达栈空间的中心点.

B.其中一个栈的栈顶到达栈空间的中心点.

C.两个栈的栈顶在栈空间的某一位置相遇.

D.两个栈均不空,且一个栈的栈顶到达另一个栈的栈底.

3.一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是()。

A.不确定B.n-i+1C.iD.n-i

4.若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出元素是()。

A.i-j-1B.i-jC.j-i+1D.不确定的

5.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pN,若pN是n,则pi是()。

A.iB.n-iC.n-i+1D.不确定

6.有六个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列?

()

A.543612B.453126C.346521D.234156

7.设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。

A.1,2,4,3,B.2,1,3,4,C.1,4,3,2,D.4,3,1,2,

8.一个栈的输入序列为12345,则下列序列中不可能是栈的输出序列的是()。

A.23415B.54132C.23145D.15432

9.设一个栈的输入序列是1,2,3,4,5,则下列序列中,是栈的合法输出序列的是()。

A.51234B.45132C.43125D.32154

10.某堆栈的输入序列为a,b,c,d,下面的四个序列中,不可能是它的输出序列的是()。

A.a,c,b,dB.b,c,d,aC.c,d,b,aD.d,c,a,b

11.设abcdef以所给的次序进栈,若在进栈操作时,允许退栈操作,则下面得不到的序列为()。

A.fedcbaB.bcafedC.dcefbaD.cabdef

12.设有三个元素X,Y,Z顺序进栈(进的过程中允许出栈),下列得不到的出栈排列是()。

A.XYZB.YZXC.ZXYD.ZYX

13.输入序列为ABC,可以变为CBA时,经过的栈操作为()

A.push,pop,push,pop,push,popB.push,push,push,pop,pop,pop

C.push,push,pop,pop,push,popD.push,pop,push,push,pop,pop

14.若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是()。

A.top=top+1;V[top]=xB.V[top]=x;top=top+1

C.top=top-1;V[top]=xD.V[top]=x;top:

=top-1

15.若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈(i=1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。

A.|top[2]-top[1]|=0B.top[1]+1=top[2]

C.top[1]+top[2]=mD.top[1]=top[2]

16.栈在()中应用。

A.递归调用B.子程序调用C.表达式求值D.A,B,C

17.一个递归算法必须包括()。

A.递归部分B.终止条件和递归部分C.迭代部分D.终止条件和迭代部分

18.执行完下列语句段后,i值为:

()

intf(intx)

{return((x>0)?

x*f(x-1):

2);}

inti;

i=f(f

(1));

A.2B.4C.8D.无限递归

19.表达式a*(b+c)-d的后缀表达式是()。

A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd

20*.表达式3*2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为(),其中^为乘幂。

A.3,2,4,1,1;(*^(+*-B.3,2,8;(*^-

C.3,2,4,2,2;(*^(-D.3,2,8;(*^(-

21.设计一个判别表达式中左,右括号是否配对出现的算法,采用()数据结构最佳。

A.线性表的顺序存储结构B.队列C.线性表的链式存储结构D.栈

22.用链接方式存储的队列,在进行删除运算时()。

A.仅修改头指针B.仅修改尾指针

C.头、尾指针都要修改D.头、尾指针可能都要修改

23.用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时()。

A.仅修改队头指针B.仅修改队尾指针

C.队头、队尾指针都要修改D.队头,队尾指针都可能要修改

24.递归过程或函数调用时,处理参数及返回地址,要用一种称为()的数据结构。

A.队列B.多维数组C.栈D.线性表

25.假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为()。

A.(rear-front+m)%mB.rear-front+1

C.(front-rear+m)%mD.(rear-front)%m

26.循环队列A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是()。

A.(rear-front+m)%mB.rear-front+1

C.rear-front-1D.rear-front

27.循环队列存储在数组A[0..m]中,则入队时的操作为()。

A.rear=rear+1B.rear=(rear+1)%(m-1)

C.rear=(rear+1)%mD.rear=(rear+1)%(m+1)

28.若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?

()

A.1和5B.2和4C.4和2D.5和1

29.用单链表表示的链式队列的队头在链表的()位置。

A.链头B.链尾C.链中D.任意

30*.若以1234作为双端队列的输入序列,则既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列是()。

A.1234B.4132C.4231D.4213

31.最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是()。

A.(rear+1)%n=frontB.rear=front

C.rear+1=frontD.(rear-l)%n=front

32.栈和队列的共同点是()。

A.都是先进先出B.都是先进后出

C.只允许在端点处插入和删除元素D.没有共同点

33.栈的特点是(①),队列的特点是(②),栈和队列都是(③)。

若进栈序列为1,2,3,4则(④)不可能是一个出栈序列(不一定全部进栈后再出栈);若进队列的序列为1,2,3,4则(⑤)是一个出队列序列。

①,②:

A.先进先出B.后进先出C.进优于出D.出优于进

③:

A.顺序存储的线性结构B.链式存储的线性结构

C.限制存取点的线性结构D.限制存取点的非线性结构

④,⑤:

A.3,2,1,4B.3,2,4,1C.4,2,3,1D.4,3,2,1F.1,2,3,4G.1,3,2,4

34.栈和队都是()

A.顺序存储的线性结构B.链式存储的非线性结构

C.限制存取点的线性结构D.限制存取点的非线性结构

35.设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是()。

A.6B.4C.3D.2

36.设有编号为1,2,3,4的四辆列车,顺序进入一个栈式结构的站台,下列不可能的出站顺序为()

A.1234B.1243C.1324D.1423

37.如果以链表作为栈的存储结构,则出栈操作时()

A.必须判别栈是否满B.必须判别栈是否为空

C.必须判别栈元素类型D.队栈可不做任何判别

38.元素A,B,C,D依次进栈以后,栈顶元素是()

A.AB.BC.CD.D

39.顺序栈存储空间的实现使用()存储栈元素。

A.链表B.数组C.循环链表D.变量

40.一个顺序栈一旦说明,其占用空间的大小()

A.已固定B.可以变动C.不能固定D.动态变化

二判断题

1.消除递归不一定需要使用栈,()

2.栈是实现过程和函数等子程序所必需的结构。

()

3.两个栈共用静态存储空间,对头使用也存在空间溢出问题。

()

4.两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。

()

5.即使对不含相同元素的同一输入序列进行两组不同的合法的入栈和出栈组合操作,所得的输出序列也一定相同。

6*.有n个数顺序(依次)进栈,出栈序列有Cn种,Cn=[1/(n+1)]*(2n)!

/[(n!

)*(n!

)]。

()

7.栈与队列是一种特殊操作的线性表。

()

8.若输入序列为1,2,3,4,5,6,则通过一个栈可以输出序列3,2,5,6,4,1.()

9.栈和队列都是限制存取点的线性结构。

()

10.若输入序列为1,2,3,4,5,6,则通过一个栈可以输出序列1,5,4,6,2,3。

()

11.任何一个递归过程都可以转换成非递归过程。

(  )

12.只有那种使用了局部变量的递归过程在转换成非递归过程时才必须使用栈。

(  )

13.队列是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。

()

14.通常使用队列来处理函数或过程的调用。

()

15.队列逻辑上是一个下端和上端既能增加又能减少的线性表。

()

16.循环队列通常用指针来实现队列的头尾相接。

()

17.循环队列也存在空间溢出问题。

()

18.队列和栈都是运算受限的线性表,只允许在表的两端进行运算。

()

19.栈和队列都是线性表,只是在插入和删除时受到了一些限制。

()

20.栈和队列的存储方式,既可以是顺序方式,又可以是链式方式。

()

21.空栈就是所有元素都为0的栈。

22.一个栈的输入序列为:

A,B,C,D,可以得到输出序列:

C,A,B,D。

23.队列是限制在两端进行操作的线性表。

24.在循环队列中,若尾指针rear大于头指针front,其元素个数为rear-front。

25.队列是一种“后进先出”的线性表。

三填空题

1.栈是_______的线性表,其运算遵循_______的原则。

2._______是限定仅在表尾进行插入或删除操作的线性表。

3.一个栈的输入序列是:

1,2,3则不可能的栈输出序列是_______。

4.设有一个空栈,栈顶指针为1000H(十六进制),现有输入序列为1,2,3,4,5,经过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH之后,输出序列是_______,而栈顶指针值是_______H。

设栈为顺序栈,每个元素占4个字节。

5.当两个栈共享一存储区时,栈利用一维数组stack(1..n)表示,两栈顶指针为top[1]与top[2],则当栈1空时,top[1]为_______,栈2空时,top[2]为_______,栈满时为_______。

6.两个栈共享空间时栈满的条件_______。

7.在作进栈运算时应先判别栈是否_

(1)_;在作退栈运算时应先判别栈是否_

(2)_;当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为_(3)_。

为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的空间时,应将两栈的_(4)_分别设在内存空间的两端,这样只有当_(5)_时才产生溢出。

8.多个栈共存时,最好用_______作为存储结构。

9.用S表示入栈操作,X表示出栈操作,若元素入栈的顺序为1234,为了得到1342出栈顺序,相应的S和X的操作串为_______。

10.顺序栈用data[1..n]存储数据,栈顶指针是top,则值为x的元素入栈的操作是_______。

11.表达式23+((12*3-2)/4+34*5/7)+108/9的后缀表达式是_______。

12.循环队列的引入,目的是为了克服_______。

13.用下标0开始的N元数组实现循环队列时,为实现下标变量M加1后在数组有效下标范围内循环,可采用的表达式是:

M=_______

14.________又称作先进先出表。

15.队列的特点是_______。

16.队列是限制插入只能在表的一端,而删除在表的另一端进行的线性表,其特点是_______。

17*.已知链队列的头尾指针分别是f和r,则将值x入队的操作序列是_______。

18.区分循环队列的满与空,只有两种方法,它们是______和______。

19.设循环队列用数组A[1..M]表示,队首、队尾指针分别是FRONT和TAIL,判定队满的条件为_______。

20*.设循环队列存放在向量sq.data[0:

M]中,则队头指针sq.front在循环意义下的出队操作可表示为_______,若用牺牲一个单元的办法来区分队满和队空(设队尾指针sq.rear),则队满的条件为_______。

21.表达式求值是_______应用的一个典型例子。

22.循环队列用数组A[0..m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列的元素个数是_______。

23.设Q[0..N-1]为循环队列,其头、尾指针分别为P和R,则队Q中当前所含元素个数为_______。

24.在栈中存取数据遵循的原则是:

25.同一栈的各元素的类型。

26.在一个链式栈中,若栈顶指针等于NULL,则表示。

27.在队列结构中,允许插入的一端称为,允许删除的一端称为。

28.队列在进行出队操作时,首先要判断;入队时首先要判断。

29.设循环队列的头指针front指向队头元素,尾指针rear指向队尾元素后的一个空闲元素,队列的最大空间为MAXLEN,则队空的标志为,队满的标志为。

四应用题

1.有5个元素,其入栈次序为:

A,B,C,D,E,在各种可能的出栈次序中,以元素C,D最先出栈(即C第一个且D第二个出栈)的次序有哪几个?

2.如果输入序列为123456,试问能否通过栈结构得到以下两个序列:

435612和135426;请说明为什么不能或如何才能得到。

【(3分)】

3.若元素的进栈序列为:

A、B、C、D、E,运用栈操作,能否得到出栈序列B、C、A、E、D和D、B、A、C、E?

为什么?

4.设输入序列为2,3,4,5,6,利用一个栈能得到序列2,5,3,4,6吗?

栈可以用单链表实现吗?

(2分)

5*.试证明:

若借助栈由输入序列1,2,…,n得到输出序列为P1,P2,…,Pn(它是输入序列的一个排列),则在输出序列中不可能出现这样的情形:

存在着i

(15分)

6.设一数列的输入顺序为123456,若采用堆栈结构,并以A和D分别表示入栈和出栈操作,试问通过入出栈操作的合法序列。

(1)能否得到输出顺序为325641的序列。

(5分)

(2)能否得到输出顺序为154623的序列。

(5分)

7.试推导出当总盘数为n的Hanoi塔的移动次数。

【(5分)】

8.用一个数组S(设大小为MAX)作为两个堆栈的共享空间。

请说明共享方法,栈满/栈空的判断条件,并用C设计公用的入栈操作push(i,x),其中i为0或1,用于表示栈号,x为入栈值。

9.给出循环队列中元素个数的计算式(设队最大长度为N,队首指针FRONT,队尾指针REAR)(5分)

10*.计算算术表达式的值时,可用两个栈作辅助工具。

对于给出的一个表达式,从左向右扫描它的字符,并将操作数放入栈S1中,运算符放入栈S2中,但每次扫描到运算符时,要把它同S2的栈顶运算符进行优先级比较,当扫描到的运算符的优先级不高于栈顶运算符的优先级时,取出栈S1的栈顶和次栈顶的两个元素,以及栈S2的栈顶运算符进行运算将结果放入栈S1中(得到的结果依次用T1、T2等表示)。

为方便比较,假设栈S2的初始栈顶为®(®运算符的优先级低于加、减、乘、除中任何一种运算)。

现假设要计算表达式:

A-B*C/D+E/F。

写出栈S1和S2的变化过程。

【(7分)】

11.有字符串次序为3*-y-a/y^2,利用栈,给出将次序改为3y-*ay2^/-的操作步骤。

(可用X代表扫描该字符串过程中顺序取一个字符进栈的操作,用S代表从栈中取出一个字符加入到新字符串尾的出栈操作。

例如,ABC变为BCA的操作步骤为XXSXSS)【(4分)】

12.将两个栈存入数组V[1..m]应如何安排最好?

这时栈空、栈满的条件是什么?

13.如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,而改置计数器count用以记录队列中结点的个数。

(1)编写实现队列的三个基本运算:

判空、入队、出队(3分)

(2)队列中能容纳元素的最多个数是多少?

(1分)

五算法设计题

1.设有两个栈S1,S2都采用顺序栈方式,并且共享一个存储区[O..maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。

试设计S1,S2有关入栈和出栈的操作算法。

(12分)

2.设从键盘输入一整数的序列:

a1,a2,a3,…,an,试编写算法实现:

用栈结构存储输入的整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。

算法应对异常情况(入栈满等)给出相应的信息。

(10分)

3.设表达式以字符形式已存入数组E[n]中,‘#’为表达式的结束符,试写出判断表达式中括号(‘(’和‘)’)是否配对的C语言描述算法:

EXYX(E);(注:

算法中可调用栈操作的基本算法,假设栈容量足够大。

)(10分)

4.从键盘上输入一个逆波兰表达式,用伪码写出其求值程序。

规定:

逆波兰表达式的长度不超过一行,以$符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。

例如:

23434+2*$(注:

算法中可调用栈操作的基本算法。

)(10分)

5.假设以I和O分别表示入栈和出栈操作。

栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。

(1)下面所示的序列中哪些是合法的?

A.IOIIOIOOB.IOOIOIIOC.IIIOIOIOD.IIIOOIOO

(2)通过对

(1)的分析,写出一个算法,判定所给的操作序列是否合法。

若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。

6.设计一个算法,判断一个算术表达式中的括号是否配对。

算术表达式保存在带头结点的单循环链表中,每个结点有两个域:

ch和link,其中ch域为字符类型。

7.请利用两个栈S1和S2来模拟一个队列。

已知栈的三个运算定义如下:

PUSH(ST,x):

元素x入ST栈;POP(ST,x):

ST栈顶元素出栈,赋给变量x;Sempty(ST):

判ST栈是否为空。

那么如何利用栈的运算来实现该队列的三个运算:

enqueue:

插入一个元素入队列;dequeue:

删除一个元素出队列;queue_empty:

判队列为空。

(请写明算法的思想及必要的注释)(10分)

8.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,请写出相应的入队列和出队列算法。

(10分)

9.如果允许在循环队列的两端都可以进行插入和删除操作。

要求:

(1)写出循环队列的类型定义;

(2)写出“从队尾删除”和“从队头插入”的算法。

(12分)

10.设计算法以求解从集合{1..n}中选取k(k<=n)个元素的所有组合。

例如,从集合{1..4}中选取2个元素的所有组合的输出结果为:

12,13,14,23,24,34。

(8分)

11.已知Q是一个非空队列,S是一个空栈。

仅用队列和栈的函数和少量工作变量,使用C语言编写一个算法,将队列Q中的所有元素逆置。

栈的函数有:

makeEmpty(s:

stack);置空栈

push(s:

stack;value:

datatype);新元素value进栈

pop(s:

stack):

datatype;出栈,返回栈顶值

isEmpty(s:

stack):

Boolean;判栈空否

队列的函数有:

enqueue(q:

queue:

value:

datatype);元素value进队

deQueue(q:

queue):

datatype;出队列,返回队头值

isEmpty(q:

queue):

boolean;判队列空否(12分)

12*.将n个队列顺序映射到数组v[0..m-1]中,每一队列在v中表示为一循环队列。

试画出其示意图并写出对应这种表示的addq和deleteq过程。

(20分)

13.设整数序列a1,a2,…,an,给出求解最大值的递归程序。

14.线性表中元素存放在向量A(1,…,n)中,元素是整型数。

试写出递归算法求出A中的最大和最小元素。

(10分)

15.试将下列递归过程改写为非递归过程。

voidtest(int&sum)

{intx;

scanf(x);

if(x=0)sum=0else{test(sum);sum+=x;}

printf(sum);

}(15分)

16.已知Ackermann函数定义如下:

(1)写出Ack(2,1)的计算过程。

(2)写出计算Ack(m,n)的非递归算法。

(15分)

第三章栈和队列

一、选

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2