第三章栈和队列练习题Word格式.docx

上传人:b****6 文档编号:16208550 上传时间:2022-11-21 格式:DOCX 页数:12 大小:21.90KB
下载 相关 举报
第三章栈和队列练习题Word格式.docx_第1页
第1页 / 共12页
第三章栈和队列练习题Word格式.docx_第2页
第2页 / 共12页
第三章栈和队列练习题Word格式.docx_第3页
第3页 / 共12页
第三章栈和队列练习题Word格式.docx_第4页
第4页 / 共12页
第三章栈和队列练习题Word格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

第三章栈和队列练习题Word格式.docx

《第三章栈和队列练习题Word格式.docx》由会员分享,可在线阅读,更多相关《第三章栈和队列练习题Word格式.docx(12页珍藏版)》请在冰豆网上搜索。

第三章栈和队列练习题Word格式.docx

next->

C、Q.front->

next=Q.front->

D、Q.front=Q.rear->

15、用不带头结点的单链表存储队列,其队头指针指向队头结点,队尾指针指向队尾结点,则在进行出队操作时

A、仅修改队头指针B、仅修改队尾指针C、队头尾指针都要修改D、队头尾指针都可能要修改。

16、栈和队列的共同点是

A、都是先进后出B、都是先进先出C、只允许在端点处插入和删除元素D、没有共同点

18、设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4,s6,s5,s1,则栈的容量至少应该是

A、B、C、D、

20、设有一顺序栈已经含有3个元素,如图3.1所示元素a4正等待进栈。

下列不可能出现的出栈序列是

0maxsize-1

A、a3,a1,a4,aB、a3,a2,a4,a1C、a3,a4,a2,a1D、a4,a3,a2,a1

图3.1二、判断题

1、在顺序栈栈满情况下,不能做进栈运算,否则会产生“上溢”。

T

2、链栈与顺序栈相比的一个优点是链栈插入和删除操作更加方便。

3、若一个栈的输入序列为1,2,3,?

,n,其输出序列的第一个元素为n,则其输出序列的每个元素ai一定满足ai=i+1。

F

4、在链队列中,即使不设置尾指针也能进行入队操作。

5、在对链队列做出队操作时,不会改变front指针的值。

6、循环队列中元素个数为rear-front。

7、一个栈的输入序列是1,2,3,4,则在栈的输出序列中可以得到4,3,1,2。

F,有5种情况

8、一个栈的输入序

列是1,2,3,4,则在栈的输出序列中可以得到1,2,3,4。

9、若以链表作为栈的存储结构,则进栈需要判断栈是否满。

10、若以链表作为栈的存储结构,则出栈需要判断栈是否空。

三、填空题

1、栈的特点是,队列的特点是。

2、线性表、栈、队列都是结构,可以在线性表的位置插入和删除元素;

对于栈只能在插入和删除元素;

对于队列只能在插入元素和在位置删除元素。

3、有程序如下,则此程序的输出结果是。

//不懂

Voidmain

{stacks;

charx,y;

initstack;

x=’c’;

y=’k’;

push;

push;

pop;

pop;

while){pop;

printf;

}

printf;

4、在栈顶指针为HS的链栈中,判定栈空的条件是。

5、向栈中压入元素的操作是先后。

6、对栈进行退栈操作是先后。

7、用循环链表表示的队列长度为n,若只设头指针,则出队和入队的时间复杂度分别是和;

若只设尾指针,则出队和入队的时间复杂度分别是和。

8、从循环队列中删除一个元素时,其操作是。

12、设栈S和队列Q的出始状态为空,元素a,b,c,d,e,f依次通过栈S,一个元素出栈后即进入队列Q。

若这6个元素出队列的顺序是b,d,c,f,e,a则栈S的容量至少应该是。

13、有程序如下,则此程序的输出结果是。

{charx=’e’,y=’c’;

enqueue;

enqueue;

dequeue;

degueue;

while){dequeue;

四、简答题

1、对于堆栈,给出三个输入项A,B,C,如果输入项序列为ABC,试给出全部可能的输出序列,并写出每种序列对应的操作。

例如:

A进B进C进C出B出A出,产生的序列为CBA。

2、简述以下算法的功能。

statusalgo1

{int

I,n,a[255];

n=0;

while){n++;

forpush;

statusalgo2

{stackt;

int

d;

initstack;

while){pop;

ifpu

sh;

}}

3、内存中一片连续空间提供给两个栈s1和s2使用,怎样分配这部分存储空间,使得对任一栈仅当这部分空间全满时才发生溢出。

6.假设Q[0,9]是一个非循环线性队列,初始状态为front=rear=0,画出做完

下列操作后队列的头尾指针的状态变化情况,如果不能入队,请指出其元素,并说明理由。

d,e,b,g,h入队d,e出队I,j,k,l,m入队b出队n,o,p,q,r入队。

第三章栈和队列1、什么叫堆栈?

什么叫队列?

、线性表、堆栈和队列这三种抽象数据类型有什么相同之处和不同之处?

、在顺序队列中,什么叫真溢出?

什么叫假溢出?

为什么顺序队列通常都采用顺序循环队列结构?

、什么叫优先级队列?

优先级队列和队列有什么相同之处和不同之处?

.什么是递归程序?

递归程序的优、缺点是什么?

递归程序在执行时,应借助于什么来完成?

递归程序的入口语句、出口语句一般用什么语句实现?

、设有个数据元素a1、a2、a和a4,对他们分别进行栈操作或队操作。

在进栈或进队操作时,按a1、a2、a3、a次序每次进入一个元素。

假设栈或队的初始状态都是空。

现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;

这时,第一次出栈得到的元素是A,第二次出栈得到的元素是B;

类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;

这时,第一次出队得到的元素是C,第二次出队得到的元素E个。

是D。

经操作后,最后在栈中或队中的元素还有供选择的答案:

A~D:

①a1②a2E:

①1②③④0③a3④a47、栈是一种线性表,它的特点是A。

设用一维数组A[1,…,n]来表示一个栈,A[n]为栈底,用整型变量T指示当前栈顶位置,A[T]为栈顶元素。

往栈中推入一个新元素时,变量T的值B变量T的值C;

从栈中弹出一个元素时,。

设栈空时,有输入序列a,b,c,经过PUSH,POP,PUSH,,变量T的值是E。

PUSH,POP操作后,从栈中弹出的元素的序列是D供选择的答案:

A:

①先进先出②后进先出③进优于出④出优于进⑤随机进出B,C:

①加1②减1③不变④清⑤加⑥减

D:

①a,bE:

①n+1②b,c②n+2③c,a④b,a⑤c,b③n④n-1⑤n-2⑥a,c8、在做进栈运算时,应先判别栈是否A;

在做退栈运算时,应先判别栈是否B。

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

为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的D当E时,才产生上溢。

分别设在这片内存空间的两端,这样,只有供选择的答案:

A,B:

①空C:

①n-1②满②n②深度③上溢③n+1③栈顶④下溢④n/④栈底D:

①长度E:

①两个栈的栈顶同时到达栈空间的中心点②其中一个栈的栈顶到达栈空间的中心点③两个栈的栈顶在达栈空间的某一位置相遇④两个栈均不空,且一个栈的栈顶到达另一个栈的栈底、写出下列中缀表达式的后缀形式:

A*B*C-A+B-C+DA*-B+C*D+E/+C10、写出下列程序段的输出结果。

voidmain{StackS;

InitStack;

Push;

}11、写出下列程序段的输出结果:

voidmain{QueueQ;

InitQueue;

charx=’e’;

y=’c’;

EnQueue;

DeQueue;

while){DeQueue;

};

}12、简述以下算法的功能。

voidalgo3{StackS;

intd;

while){Pop;

}}13、有个元素,其入栈次序为:

A,B,C,D,E,在各种可能的出栈次序中,以元素C,D最先出栈的次序有哪几个?

14、假设以S和X分别表示入栈和出栈操作,则对初态和终态均为空的栈操作可由S和X组成的序列表示。

试指出判别给定序列是否合法的一般规则。

两个不同合法序列能否得到相同的输出元素序列?

如能得到,请举列说明。

15、编写一个从栈建立队列的伪码算法StacktoQueue,队列建成后,队列的头为栈顶,队列的尾为栈底,算法结束后,栈为

空。

与栈有关的操作为:

popStackemptyStackpushStackStackTop元素出栈栈空元素进栈取栈顶与队列有关的操作为:

enqueuedequeuefullqueue入队出队队列满16、假设带头结点的循环链表表示对列,并且只设一个指针指向队尾元素结点,试编写相应的队列初始化、入队列和出队列的算法。

17、设顺序双向循环队列的数据结构定义为:

typedefstruct{DataTypelist[MaxSize];

intfront;

/*队头指针*/intrear;

/*队尾指针*/}BSeqCQueue;

设Q为BSeqCQueue类型的变参,并设初始化操作时有:

Q->

rear=Q->

front=0,现要求:

给出顺序双向循环队列满和空的条件。

给出顺序双向循环队列的入队列操作和出队列操作算法思想。

18、假设称正读和反读都相同的字符序列为“回文”,例如‘abba’和‘abcba’是回文,‘abcde’和‘ababab’则不是回文,试写一个算法判别读入的一个似‘@’为结束符的字符序列是否是“回文”。

第三章栈和队列习题答案

一、基础知识题

3.1设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题:

若入、出栈次序为Push,Pop,Push,Push,Pop,Pop,Push,Pop,则出栈的数字序列为何表示i进栈,Pop表示出栈)?

能否得到出栈序列1423和1432?

并说明为什么不能得到或者如何得到。

请分析1,,,的24种排列中,哪些序列是可以通过相应的入出栈操作得到的。

答:

出栈序列为:

1324

不能得到1423序列。

因为要得到14的出栈序列,则应做Push,Pop,Push,Push,Push,Pop。

这样,3在栈顶,2在栈底,所以不能得到23的出栈序列。

能得到1432的出栈序列。

具体操作为:

Push,Pop,Push,Push,Push,Pop,Pop,Pop。

在1,,,的24种排列中,可通过相应入出栈操作得到的序列是:

1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,4321

不能得到的序列是:

1423,2413,3124,3142,3412,4123,4132,4213,4231,4312

3.链栈中为何不设置头结点?

链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。

3.循环队列的优点是什么?

如何判别它的空和满?

循环队列的优点是:

它可以克服顺序队列的”假上溢”现象,能够使存储队列的向量空间得到充分的利用。

判别循环队列的”空”或”满”不能以头尾指针是否相等来确定,一般是通过以下几种方法:

一是另设一布尔变量来区别队列的空和满。

二是少用一个元素的空间,每次入队前测试入队后头尾指针是否会重合,如果会重合就认为队列已满。

三是设置一计数器记录队列中元素总数,不仅可判别空或满,还可以得到队列中元素的个数。

3.设长度为n的链队用单循环链表表示,若设头指针,则入队出队操作的时间为何?

若只设尾指针呢?

当只设头指针时,出队的时间为1,而入队的时间需要n,因为每次入队均需从头指针开始查找,找到最后一个元素时方可进行入队操作。

若只设尾指针,则出入队时间均为1。

因为是循环链表,尾指针所指的下一个元素就是头指针所指元素,所以出队时不需要遍历整个队列。

3.指出下述程序段的功能是什么?

voidDemo1{

inti;

arr[64];

n=0;

while)arr[n++]=Pop;

forPush;

}//Demo1

SeqStackS1,S2,tmp;

DataTypex;

...//假设栈tmp和S2已做过初始化

while)

{x=Pop;

}

{x=Pop;

voidDemo2

{//设DataType为int型

SeqStackT;

InitStack;

if)!

=m)Push;

{

i=Pop;

voidDemo3

intx;

SeqStackS;

{x=DeQueue;

{x=Pop;

EnQueue;

}//Demo3

CirQueueQ1,Q2;

//设DataType为int型

intx,i,n=0;

...//设Q1已有内容,Q2已初始化过

{x=DeQueue;

n++;

for

程序段的功能是将一栈中的元素按反序重新排列,也就是原来在栈顶的元素放到栈底,栈底的元素放到栈顶。

此栈中元素个数限制在64个以内。

程序段的功能是利用tmp栈将一个非空栈s1的所有元素按原样复制到一个栈s2当中去。

程序段的功能是利用栈T,将一个非空栈S中值等于m的元素全部删去。

程序段的功能是将一个循环队列Q经过S栈的处理,反向排列,原来的队头变成队尾,原来的队尾变成队头。

这段程序的功能是将队列1的所有元素复制到队列2中去,但其执行过程是先把队列1的元素全部出队,进入队列2,然后再把队列2的元素复制到队列1中。

二、算法设计题

3.回文是指正读反读均相同的字符序列,如”abba”和”abdba”均是回文,但”good”不是回文。

试写一个算法判定给定的字符向量是否为回文。

解:

根据提示,算法可设计为:

//以下为顺序栈的存储结构定义

#defineStackSize100//假定预分配的栈空间最多为100个元素

typedefcharDataType;

//假定栈元素的数据类型为字符

typedefstruct{

DataTypedata[StackSize];

inttop;

}SeqStack;

intIsHuiwen

{//判断t字符向量是否为回文,若是,返回1,否则返回0

SeqStacks;

inti,len;

chartemp;

len=strlen;

//求向量长度

for//将一半字符入栈

while)

{//每弹出一个字符与相应字符比较

temp=Pop;

ifreturn0;

//不等则返回0

elsei++;

return1;

//比较完毕均相等则返回1

3.利用栈的基本操作,写一个将栈S中所有结点均删去的算法voidClearStack,并说明S为何要作为指针参数?

算法如下

voidClearStack

{//删除栈中所有结点

S->

Top=-1;

//其实只是将栈置空

因为要置空的是栈S,如果不用指针来做参数传递,那么函数进行的操作不能对原来的栈产生影响,系统将会在内存中开辟另外的单元来对形参进行函数操作。

结果等于什么也没有做。

所以想要把函数操作的结果返回给实参的话,就只能用指针来做参数传递了。

3.利用栈的基本操作,写一个返回S中结点个数的算法intStackSize,并说明S为何不作为指针参数?

算法如下:

intStackSize

{//计算栈中结点个数

intn=0;

if)

Pop;

returnn;

上述算法的目的只要得到S栈的结点个数就可以了。

并不能改变栈的结构。

所以S不用指针做参数,以避免对原来的栈中元素进行任何改变。

系统会把原来的栈按值传递给形参,函数只对形参进行操作,最后返回元素个数。

3.设计算法判断一个算术表达式的圆括号是否正确配对。

‘就退掉栈顶的’

{//检查表达式ST中括号是否配对

//定义一个栈

for;

i++)

ifPush;

//遇’’)//遇’)’

if)//栈不为空时,将栈顶元素出栈

elsereturn0;

//不匹配,返回0

ifEmptyStackreturn1;

//匹配,返回1

3.10一个双向栈S是在同一向量空间内实现的两个栈,它们的栈底分别设在向量空间的两端。

试为此双向栈设计初始化InitStack、入栈Push和出栈Pop等算法,其中i为0或1,用以表示栈号。

双向栈其实和单向栈原理相同,只是在一个向量空间内,好比是两个头对头的栈放在一起,中间的空间可以充分利用。

双向栈的算法设计如下:

//双向栈的栈结构类型与以前定义略有不同

#defineStackSize100//假定分配了100个元素的向量空间

#definecharDataType

DataTypeData[StackSize]

inttop0;

//需设两个指针

inttop1;

}DblStack

voidInitStack

{//初始化双向栈

top0=-1;

top1=StackSize;

//这里的top2也指出了向量空间,但由于是作为栈底,因此不会出错}

intEmptyStack

{//判栈空

return;

intFullStack

{//判栈满,满时肯定两头相遇

voidPush

{//进栈

if)

Error;

//上溢、退出运行

ifS->

Data[++S->

top0]=x;

//栈0入栈

Data[--S->

top1]=x;

//栈1入栈

DataTypePop

{//出栈

//下溢退出

if

//返回栈顶元素,指针值减1

//因为这个栈是以另一端为底的,所以指针值加1。

3.11Ackerman函数定义如下:

请写出递归算法。

┌n+1当m=0时

AKM=│AKM当m≠0,n=0时

└AKM)当m≠0,n≠0时

算法如下

intAKM

ifreturnn+1;

ifreturnAKM;

ifreturnAKM);

3.1用第二种方法,即少用一个元素空间的方法来区别循环队列的队空和队满,试为其设计置空队,判队空,判队满、出队、入队及取队头元素等六个基本操作的算法。

算法设计如下:

//循环队列的定义

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1