ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:21.90KB ,
资源ID:3303016      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3303016.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第三章栈和队列练习题.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、第三章栈和队列练习题 第三章,栈和队列,练习题 一、 选择题 1、栈结构通常采用的两种存储结构是。 A、顺序存储结构和链表存储结构 B、散列和索引 C、链表存储结构和数组 D、线性链表和非线性存储 2、设栈ST用顺序存储结构表示,则栈ST为空的条件是 A、ST.top-ST.base0 B、ST.top-ST.base=0 C、ST.top-ST.basen D、ST.top-ST.base=n 3、向一个栈顶指针为HS的链栈中插入一个s结点时,则执行 A、HS-next=s; B、s-next=HS-next;HS-next=s; C、s-next=HS;HS=s; D、s-next=HS;

2、HS=HS-next; 4、从一个栈顶指针为HS的链栈中删除一个结点,用x保存被删除结点的值,则执行 A、x=HS;HS=HS-next; B、HS=HS-next;x=HS-data; C、 x=HS-data;HS=HS-next; D、s-next=Hs;Hs=HS-next; 7、一个队列的入列序列是1,2,3,4, 则队列的输出序列是/尾插入元素,头删除元素。 A、4,3,2,1 B、1,2,3,C、1,4,3,D、3,2,4,1 9、循环队列SQ采用数组空间SQ.base0,n-1存放其元素值,已知其头尾指针分别是front和rear,则判定此循环队列为满的条件是/不懂啊 A、Q.

3、front=Q.rear B、Q.front!=Q.rear C、Q.front=%n D、Q.front!=%n 11、用单链表表示的链式队列的队头在链表的位置 A、链头 B、链尾 C、链中 12、判定一个链队列Q为空的条件是 A、Q.front=Q.rear B、Q.front!=Q.rear C、Q.front=%n D、Q.front!=%n 14、在一个链队列Q中,删除一个结点需要执行的指令是 A、Q.rear=Q.front-next; B、Q.rear-next=Q.rear-next-next; C、Q.front-next=Q.front-next-next; D、Q.fro

4、nt=Q.rear-next; 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正等待进栈。下列不可能出现的

5、出栈序列是 0 maxsize-1 A、a3,a1,a4,aB、 a3,a2,a4,a1 C、 a3,a4,a2,a1 D、 a4,a3,a2,a1 图3.1二、判断题 1、在顺序栈栈满情况下,不能做进栈运算,否则会产生“上溢”。T 2、链栈与顺序栈相比的一个优点是链栈插入和删除操作更加方便。T 3、若一个栈的输入序列为1,2,3,?,n,其输出序列的第一个元素为n,则其输出序列的每个元素ai一定满足ai=i+1。F 4、在链队列中,即使不设置尾指针也能进行入队操作。F 5、在对链队列做出队操作时,不会改变front指针的值。F 6、循环队列中元素个数为rear-front。F 7、一个栈的输

6、入序列是1,2,3,4,则在栈的输出序列中可以得到4,3,1,2。F,有5种情况 8、一个栈的输入序 列是1,2,3,4,则在栈的输出序列中可以得到1,2,3,4。T 9、 若以链表作为栈的存储结构,则进栈需要判断栈是否满。F 10、 若以链表作为栈的存储结构,则出栈需要判断栈是否空。T 三、 填空题 1、栈的特点是,队列的特点是。 2、线性表、栈、队列都是结构,可以在线性表的位置插入和删除元素;对于栈只能在插入和删除元素;对于队列只能在插入元素和在位置删除元素。 3、有程序如下,则此程序的输出结果是。/不懂 Void main stack s; char x,y; initstack ; x

7、=c;y=k; push;push;push; pop;push;push;pop;push; 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的容

8、量至少应该是。 13、有程序如下,则此程序的输出结果是。 Void main char x=e,y=c; enqueue;enqueue;enqueue;dequeue;enqueue;degueue; enqueue; while)dequeue;printf; printf; 四、 简答题 1、 对于堆栈,给出三个输入项A,B,C,如果输入项序列为ABC,试给出全部可能的输出序列,并写出每种序列对应的操作。例如:A进B进C进C出B出A出,产生的序列为CBA。 2、 简述以下算法的功能。 status algo1 int I,n,a255;n=0;while)n+;pop; forpush;

9、 status algo2 stack t;int d;initstack;while)pop;ifpu sh; while)pop;push; 3、 内存中一片连续空间提供给两个栈s1和s2使用,怎样分配这部分存储空间,使得对任一栈仅当这部分空间全满时才发生溢出。 6. 假设Q0,9是一个非循环线性队列,初始状态为front=rear=0,画出做完 下列操作后队列的头尾指针的状态变化情况,如果不能入队,请指出其元素,并说明理由。 d,e,b,g,h入队 d,e出队 I,j,k,l,m入队 b出队 n,o,p,q,r入队。 第三章 栈和队列1、什么叫堆栈?什么叫队列?、 线性表、堆栈和队列这三

10、种抽象数据类型有什么相同之处和不同之处?、 在顺序队列中,什么叫真溢出?什么叫假溢出?为什么顺序队列通常都采 用顺序循环队列结构?、 什么叫优先级队列?优先级队列和队列有什么相同之处和不同之处?. 什么是递归程序? 递归程序的优、缺点是什么? 递归程序在执行时,应借助于什么来完成? 递归程序的入口语句、出口语句一般用什么语句实现?、设有 个数据元素 a1、a2、a和 a4,对他们分别进行栈操作或队操作。在 进栈或进队操作时,按 a1、a2、a3、a次序每次进入一个元素。假设栈或队的 初始状态都是空。 现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时, 第一次出栈得到的元素是 A

11、 ,第二次出栈得到的元素是 B ;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出 队一次;这时,第一次出队得到的元素是 C ,第二次出队得到的元素 E 个。是 D 。经操作后,最后在栈中或队中的元素还有供选择的答案: AD:a1 a2E: 1 0 a3a47、 栈是一种线性表,它的特点是 A 。设用一维数组 A1,n来表示一个栈, An为栈底,用整型变量 T 指示当前栈顶位置,AT为栈顶元素。往栈中推入 一个新元素时,变量 T 的值 B 变量 T 的值 C ;从栈中弹出一个元素时,。设栈空时,有输入序列 a,b,c,经过 PUSH,POP,PUSH, ,变量 T

12、的值是 E 。PUSH,POP 操作后,从栈中弹出的元素的序列是 D供选择的答案:A: 先进先出 后进先出 进优于出 出优于进 随机进出 B,C: 加 1 减 1 不变 清 加 减 D: a,b E: n+1b,c n+2c,a b,a c,b n n-1 n-2 a,c8、在做进栈运算时,应先判别栈是否 A ;在做退栈运算时,应先判别栈是 否 B 。当栈中元素为 n 个,做进栈运算时发生上溢,则说明该栈的最大容量 为 C 。为了增加内存空间的利用率和减少溢出的可能性, 由两个栈共享一片连续的 内存空间时,应将两栈的 D 当 E 时,才产生上溢。 分别设在这片内存空间的两端,这样,只有供选择的

13、答案:A,B:空 C: n-1 满 n 深度 上溢 n+1 栈顶 下溢 n/ 栈底D: 长度E: 两个栈的栈顶同时到达栈空间的中心点 其中一个栈的栈顶到达栈空间的中心点 两个栈的栈顶在达栈空间的某一位置相遇 两个栈均不空,且一个栈的栈顶到达另一个栈的栈底、写出下列中缀表达式的后缀形式: A * B * C - A + B - C + D A* - B + C * D + E / + C 10、写出下列程序段的输出结果 。 void main Stack S; char x,y; InitStack; x=c;y=k; Push; Push; Push; 11、写出下列程序段的输出结果: 。 v

14、oid main Queue Q; Init Queue ; char x=e; y=c; EnQueue ; EnQueue ; EnQueue ; DeQueue ; EnQueue ; DeQueue ; EnQueue ; while) DeQueue ;printf; ; printf; 12、简述以下算法的功能 。 void algo3 Stack S; int d; InitStack; while) DeQueue ; Push; ; while) Pop; EnQueue ; 13、有 个元素,其入栈次序为:A,B,C,D,E,在各种可能的出栈次序中, 以元素 C,D 最先出

15、栈的次序有哪几个? 14、假设以 S 和 X 分别表示入栈和出栈操作,则对初态和终态均为空的栈操作 可由 S 和 X 组成的序列表示 。 试指出判别给定序列是否合法的一般规则。 两个不同合法序列能否得到相同的输出元素序列? 如能得到,请举列说明。 15、编写一个从栈建立队列的伪码算法 StacktoQueue,队列建成后,队列的头 为栈顶,队列的尾为栈底,算法结束后,栈为 空。 与栈有关的操作为:popStack emptyStack pushStack StackTop元素出栈 栈空 元素进栈 取栈顶与队列有关的操作为: enqueue dequeue fullqueue 入队 出队 队列满

16、16、假设带头结点的循环链表表示对列,并且只设一个指针指向队尾元素结点 ,试编写相应的队列初始化、入队列和出队列的算法。 17、设顺序双向循环队列的数据结构定义为: typedef struct DataType listMaxSize; int front; /*队头指针*/ int rear; /*队尾指针*/ BSeqCQueue; 设 Q 为 BSeqCQueue 类型的变参, 并设初始化操作时有: Q-rear = Q-front = 0, 现要求: 给出顺序双向循环队列满和空的条件。 给出顺序双向循环队列的入队列操作和出队列操作算法思想。 18、假设称正读和反读都相同的字符序列为“

17、回文” ,例如abba和abcba 是回文, abcde 和 ababab 则不是回文, 试写一个算法判别读入的一个似 为结束符的字符序列是否是“回文” 。 第三章 栈和队列习题答案 一、基础知识题 3.1 设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题: 若入、出栈次序为Push, Pop,Push,Push, Pop, Pop,Push, Pop,则出栈的数字序列为何表示i进栈,Pop表示出栈)? 能否得到出栈序列1423和1432?并说明为什么不能得到或者如何得到。 请分析 1,的24种排列中,哪些序列是可以通过相应的入出栈操作得到的

18、。 答:出栈序列为: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,4

19、213,4231,4312 3.链栈中为何不设置头结点? 答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。 3.循环队列的优点是什么? 如何判别它的空和满? 答:循环队列的优点是:它可以克服顺序队列的”假上溢”现象,能够使存储队列的向量空间得到充分的利用。判别循环队列的”空”或”满”不能以头尾指针是否相等来确定,一般是通过以下几种方法:一是另设一布尔变量来区别队列的空和满。二是少用一个元素的空间,每次入队前测试入队后头尾指针是否会重合,如果会重合就认为队列已满。三是设置一计数器记录队

20、列中元素总数,不仅可判别空或满,还可以得到队列中元素的个数。 3.设长度为n的链队用单循环链表表示,若设头指针,则入队出队操作的时间为何? 若只设尾指针呢? 答:当只设头指针时,出队的时间为1,而入队的时间需要n,因为每次入队均需从头指针开始查找,找到最后一个元素时方可进行入队操作。若只设尾指针,则出入队时间均为1。因为是循环链表,尾指针所指的下一个元素就是头指针所指元素,所以出队时不需要遍历整个队列。 3.指出下述程序段的功能是什么? void Demo1 int i; arr64 ; n=0 ; while ) arrn+=Pop; for Push; /Demo1 SeqStack S1

21、, S2, tmp; DataType x; ./假设栈tmp和S2已做过初始化 while ) x=Pop ; Push; while ) x=Pop; Push; Push; void Demo2 / 设DataType 为int 型 SeqStack T; int i; InitStack ; while ) if) !=m) Push; while ) i=Pop; Push; void Demo3 / 设DataType 为int 型 int x; SeqStack S; InitStack; while ) x=DeQueue; Push; while ) x=Pop; EnQue

22、ue; / Demo3 CirQueue Q1, Q2; / 设DataType 为int 型 int x, i , n= 0; . / 设Q1已有内容, Q2已初始化过 while ) x=DeQueue ; EnQueue; n+; for x=DeQueue ; EnQueue ; EnQueue; 答: 程序段的功能是将一栈中的元素按反序重新排列,也就是原来在栈顶的元素放到栈底,栈底的元素放到栈顶。此栈中元素个数限制在64个以内。 程序段的功能是利用tmp栈将一个非空栈s1的所有元素按原样复制到一个栈s2当中去。 程序段的功能是利用栈T,将一个非空栈S中值等于m的元素全部删去。 程序段

23、的功能是将一个循环队列Q经过S栈的处理,反向排列,原来的队头变成队尾,原来的队尾变成队头。 这段程序的功能是将队列1的所有元素复制到队列2中去,但其执行过程是先把队列1的元素全部出队,进入队列2,然后再把队列2的元素复制到队列1中。 二、算法设计题 3.回文是指正读反读均相同的字符序列,如”abba”和”abdba”均是回文,但”good”不是回文。试写一个算法判定给定的字符向量是否为回文。 解:根据提示,算法可设计为: /以下为顺序栈的存储结构定义 #define StackSize 100 /假定预分配的栈空间最多为100个元素 typedef char DataType;/假定栈元素的数

24、据类型为字符 typedef struct DataType dataStackSize; int top; SeqStack; int IsHuiwen /判断t字符向量是否为回文,若是,返回1,否则返回0 SeqStack s; int i , len; char temp; InitStack; len=strlen; /求向量长度 for /将一半字符入栈 Push; while) / 每弹出一个字符与相应字符比较 temp=Pop ; if return 0 ;/ 不等则返回0 else i+; return 1 ; / 比较完毕均相等则返回 1 3.利用栈的基本操作,写一个将栈S中

25、所有结点均删去的算法void ClearStack,并说明S为何要作为指针参数? 解: 算法如下 void ClearStack / 删除栈中所有结点 S-Top = -1; /其实只是将栈置空 因为要置空的是栈S,如果不用指针来做参数传递,那么函数进行的操作不能对原来的栈产生影响,系统将会在内存中开辟另外的单元来对形参进行函数操作。结果等于什么也没有做。所以想要把函数操作的结果返回给实参的话,就只能用指针来做参数传递了。 3.利用栈的基本操作, 写一个返回S中结点个数的算法 int StackSize,并说明S为何不作为指针参数? 解:算法如下: int StackSize /计算栈中结点个

26、数 int n=0; if) Pop; n+; return n; 上述算法的目的只要得到S栈的结点个数就可以了。并不能改变栈的结构。所以S不用指针做参数,以避免对原来的栈中元素进行任何改变。系统会把原来的栈按值传递给形参,函数只对形参进行操作,最后返回元素个数。 3.设计算法判断一个算术表达式的圆括号是否正确配对。 就退掉栈顶的 /检查表达式ST中括号是否配对 int i; SeqStack S; /定义一个栈 InitStack ; for ; i+) if Push; /遇 ) /遇) if )/栈不为空时,将栈顶元素出栈 Pop; else return 0;/不匹配,返回0 if E

27、mptyStack return 1;/ 匹配,返回1 else return 0;/不匹配,返回0 3.10 一个双向栈S是在同一向量空间内实现的两个栈,它们的栈底分别设在向量空间的两端。 试为此双向栈设计初始化InitStack 、入栈Push 和出栈Pop等算法, 其中i为0 或1, 用以表示栈号。 解:双向栈其实和单向栈原理相同,只是在一个向量空间内,好比是两个头对头的栈放在一起,中间的空间可以充分利用。双向栈的算法设计如下: /双向栈的栈结构类型与以前定义略有不同 #define StackSize 100 / 假定分配了100个元素的向量空间 #define char DataTy

28、pe typedef struct DataType DataStackSize int top0; /需设两个指针 int top1; DblStack void InitStack /初始化双向栈 S-top0 = -1; S-top1 = StackSize; /这里的top2也指出了向量空间,但由于是作为栈底,因此不会出错 int EmptyStack /判栈空 return ; int FullStack /判栈满,满时肯定两头相遇 return ; void Push /进栈 if ) Error;/上溢、退出运行 if S-Data + S-top0= x; /栈0入栈 if S

29、-Data - S-top1= x; / 栈1入栈 DataType Pop /出栈 if ) Error;/下溢退出 if return ;/返回栈顶元素,指针值减1 if return ; /因为这个栈是以另一端为底的,所以指针值加1。 3.11 Ackerman 函数定义如下:请写出递归算法。 n+1 当m=0时 AKM = AKM 当m0 ,n=0时 AKM) 当m0, n 0时 解:算法如下 int AKM if return n+1; if return AKM; if return AKM); 3.1用第二种方法 ,即少用一个元素空间的方法来区别循环队列的队空和队满,试为其设计置空队,判队空,判队满、出队、入队及取队头元素等六个基本操作的算法。 解:算法设计如下: /循环队列的定义

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

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