第三章栈和队列习题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三章 栈和队列
1、什么叫堆栈?什么叫队列? 2、 线性表、堆栈和队列这三种抽象数据类型有什么相同之处和不同之处? 3、 在顺序队列中,什么叫真溢出?什么叫假溢出?为什么顺序队列通常都采 用顺序循环队列结构? 4、 什么叫优先级队列?优先级队列和队列有什么相同之处和不同之处? 5.(1) 什么是递归程序? (2)递归程序的优、缺点是什么? (3)递归程序在执行时,应借助于什么来完成? (4)递归程序的入口语句、出口语句一般用什么语句实现? 6、设有 4 个数据元素 a1、a2、a3 和 a4,对他们分别进行栈操作或队操作。在 进栈或进队操作时,按 a1、a2、a3、a4 次序每次进入一个元素。假设栈或队的 初始状态都是空。 现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时, 第一次出栈得到的元素是 A ,第二次出栈得到的元素是 B ;类似地,
考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出 队一次;这时,第一次出队得到的元素是 C ,第二次出队得到的元素 E 个。
是 D 。经操作后,最后在栈中或队中的元素还有
供选择的答案: A~D:①a1 ②a2
E: ①1 ②2 ③ 3 ④ 0
③ a3
④a4
7、 栈是一种线性表,它的特点是 A 。设用一维数组 A[1,…,n]来表示一个栈, A[n]为栈底,用整型变量 T 指示当前栈顶位置,A[T]为栈顶元素。往栈中推入 (PUSH)一个新元素时,变量 T 的值 B 变量 T 的值 C ;从栈中弹出(POP)一个元素时,
。设栈空时,有输入序列 a,b,c,经过 PUSH,POP,PUSH, ,变量 T 的值是 E 。
PUSH,POP 操作后,从栈中弹出的元素的序列是 D
供选择的答案:
A:① 先进先出 ②后进先出 ③进优于出 ④出优于进 ⑤随机进出 B,C:① 加 1 ②减 1 ③不变 ④清 ⑤ 加 2 ⑥减 2

D:① a,b E: ① n+1
②b,c ②n+2
③c,a ④b,a ⑤ c,b ③ n ④ n-1 ⑤ n-2
⑥ a,c
8、在做进栈运算时,应先判别栈是否 A ;在做退栈运算时,应先判别栈是 否 B 。当栈中元素为 n 个,做进栈运算时发生上溢,则说明该栈的最大容量 为 C 。
为了增加内存空间的利用率和减少溢出的可能性, 由两个栈共享一片连续的 内存空间时,应将两栈的 D 当 E 时,才产生上溢。 分别设在这片内存空间的两端,这样,只有
供选择的答案:
A,B:①空 C: ①n-1 ② 满 ② n ②深度 ③ 上溢 ③ n+1 ③ 栈顶 ④ 下溢 ④ n/2 ④ 栈底
D: ① 长度
E: ①两个栈的栈顶同时到达栈空间的中心点 ②其中一个栈的栈顶到达栈空间的中心点 ③两个栈的栈顶在达栈空间的某一位置相遇 ④两个栈均不空,且一个栈的栈顶到达另一个栈的栈底 9、写出下列中缀表达式的后缀形式: (1) A * B * C (2) - A + B - C + D (3) A* - B + C (4) (A + B) * D + E / (F + A * D) + C 10、写出下列程序段的输出结果(栈的元素类型 SElem Type 为 char) 。 void main( ){ Stack S; char x,y; InitStack(S); x=’c’;y=’k’; Push(S,x); Push(S,’a’); Push(S,y);

} 11、写出下列程序段的输出结果: (队列中的元素类型 QElem Type 为 char) 。 void main( ){ Queue Q; Init Queue (Q); char x=’e’; y=’c’; EnQueue (Q,’h’); EnQueue (Q,’r’); EnQueue (Q,’y’); DeQueue (Q,x); EnQueue (Q,x); DeQueue (Q,x); EnQueue (Q,’a’); while(!QueueEmpty(Q)){ DeQueue (Q,y);printf(y); }; printf(x); } 12、简述以下算法的功能(栈和队列的元素类型均为 int) 。 void algo3(Queue &Q){ Stack S; int d; InitStack(S); while(!QueueEmpty(Q)){ DeQueue (Q,d); Push(S,d); }; while(!StackEmpty(S)){ Pop(S,d); EnQueue (Q,d); } } 13、有 5 个元素,其入栈次序为:A,B,C,D,E,在各种可能的出栈次序中, 以元素 C,D 最先出栈(即 C 第一个且 D 第二个出栈)的次序有哪几个? 14、假设以 S 和 X 分别表示入栈和出栈操作,则对初态和终态均为空的栈操作 可由 S 和 X 组成的序列表示(如 SXSX) 。 (1)试指出判别给定序列是否合法的一般规则。 (2)两个不同合法序列(对同一输入序列)能否得到相同的输出元素序列? 如能得到,请举列说明。 15、编写一个从栈建立队列的伪码算法 StacktoQueue,队列建成后,队列的头 (front)为栈顶(top),队列的尾(rear)为栈底(bottom),算法结束后,栈为

空。 (提示:假设栈 S 已经建成,已有若干元素在栈中。 ) 与栈有关的操作为:
popStack(S,x) emptyStack(S) pushStack(S,x) StackTop(S,x)
元素出栈 栈空 元素进栈 取栈顶
与队列有关的操作为: enqueue(Q,x) dequeue(Q,x) fullqueue(Q) 入队 出队 队列满
16、假设带头结点的循环链表表示对列,并且只设一个指针指向队尾元素结点 (注意不设头指针) ,试编写相应的队列初始化、入队列和出队列的算法。 17、设顺序双向循环队列的数据结构定义为: typedef struct { DataType list[MaxSize]; int front; /*队头指针*/ int rear; /*队尾指针*/ } BSeqCQueue; 设 Q 为 BSeqCQueue 类型的变参, 并设初始化操作时有: Q->rear = Q->front = 0, 现要求: (1)给出顺序双向循环队列满和空的条件。 (2)给出顺序双向循环队列的入队列操作和出队列操作算法思想。 18、假设称正读和反读都相同的字符序列为“回文” ,例如‘abba’和‘abcba’ 是回文, ‘abcde’ 和 ‘ababab’ 则不是回文, 试写一个算法判别读入的一个似 ‘@’ 为结束符的字符序列是否是“回文” 。

相关文档
最新文档