数据结构习题答案_第1页
数据结构习题答案_第2页
数据结构习题答案_第3页
数据结构习题答案_第4页
数据结构习题答案_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章习题 1. 按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答: 如进站的车厢序歹 0 为123,则可能得到的出站车厢序歹 0 是什么? 如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明原因。(即写出 以“S”表示进栈、以“ X”表示出栈的栈操作序列)。 2. 设队列中有A、B、C、E这5个元素,其中队首元素为 A。如果对这个队列重复执行下列 4步 操作: (1) 输出队首元素; (2) 把队首元素值插入到队尾; (3) 删除队首元素; (4) 再次删除队首元素。 直到队列成为空队列为止,得到输出序列: (1) A G E、G C (

2、2) A、C、E (3) A、C、E、C、C、C (4) A、C、E、C 3. 给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满? 4. 按照四则运算加、减、乘、除和籍运算(f)优先关系的惯例,画出对下列算术表达式求值时操 作数栈和运算符栈的变化过程: A B* C/D+ E f F 5. 试写一个算法,判断依次读入的一个以遂结束符的字母序列,是否为形如序列 1 &序列2 模式的字符序歹 0。其中序列1和序列2中都不含字符&,且序列2是序列1的逆序歹 0。例如, a+b&b+a是届该模式的字符序歹 0,而1 +3 &3 1 则不是。 6.

3、假设表达式由单字母变量和双目四则运算算符构成。试写一个算法,将一个通常书写形式且书写 正确的表达式转换为逆波兰式。 7. 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针), 试编写相应的队列初始化、入队列和出队列的算法。 8. 要求循环队列不损失一个空间全部都能得到利用,设置一个标志域tag ,以tag为0或1来区分 头尾指针相同时的队列状态的空与满,请编写与此结构相应的入队与出队算法。 9. 简述以下算法的功能(其中栈和队列的元素类型均为 int ): (1) void proc_1(Stack S) ( int i, n, A255; n=0; whil

4、e(!EmptyStack(S) (n+; Pop(&S, &An); for(i=1; itop=-1表示栈空。 判断栈S满:如果S-top=Stack_Size-1 表示栈满。 (2)链栈(top为栈顶指针,指向当前栈顶元素前面的头结点) 判断栈空:如果top-next=NULL表示栈空。 判断栈满:当系统没有可用空间时,申请不到空间存放要进栈的元素,此时栈满。 3. 4照四则运算加、减、乘、除和籍运算的优先惯例,画出对下列表达式求值时操作数栈和运算符栈 的变化过程:A-B*C/D+E f F 【解答】OVS OPTR OVS OPTR OVS OPTR,+ OPTR7,

5、生成 T(1)/D T(2) A OVS CPTR OVS OPTR 右边界* T(4) front=Q-front & tag=1) /* 队满 */ return(FALSE); if(Q-front=Q-front & tag=0) /*x入队前队空,x入队后重新设置标志*/ tag=1; Q-elememtQ-rear=x; Q-rear=(Q-rear+1)%MAXSIZE; /*设置队尾指针 */ Return(TRUE); 出队算法: int DeleteQueue( SeqQueue *Q , QueueElementType *x) ( /*删除队头元素,用x

6、返回其值*/ if(Q-front=Q-rear & tag=0) /* 队空 */ return(FALSE); *x=Q-elementQ-front; Q-front=(Q-front+1)%MAXSIZE; /*重新设置队头指针 */ if(Q-front=Q-rear) tag=0; /*队头元素出队后队歹0为空,重新设置标志域 */ Return(TUUE); 编写求解Hanoi问题的算法,并给出三个盘子搬动时的递归调用过程。 【解答】算法: void hanoi (int n ,char x, char y, char z) ( /*将塔座X上按直径由小到大且至上而下编号

7、为 1到n的n个圆盘按规则搬到塔座Z上,Y可用 做辅助塔座*/ if(n = =1) move(x,1,z); else ( Hanoi(n-1,x,z,y); move(x, n, z); Hanoi(n-1, y,x,z); Hanoi(3,A,B,C)的递归调用过程: Hanoi(2,A,C,B): Hanoi(2,B,A,C) 提示: 习题 1. 按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答: 如进站的车厢序列为 123,则可能得到的出站车厢序列是什么? 如进站的车厢序列为 123456,能否得到435612和135426的出站序列,并说明原因。(即写出以“ S

8、”表 示进栈、以“ X”表示出栈的栈操作序列)。 SXSS XSSX XXSX 或 S1X1S2S3X3S4S5X5X4X2S6X6 A、B、C、D、E这5个元素,其中队首元素为 A。如果对这个队列重复执行下列 4步操作: (1) 输出队首兀素; 2) 把队首兀素值插入到队尾; 3) 删除队首兀素; 4) 再次删除队首兀:素。 Hanoi(1,A,B,C) move(A-C) 1 号搬到 C Move(A-B) 2号搬到B Hanoi(1,C,A,B) move(C-B) 1 号搬到 B Move(A-C) 3号搬到C Hanoi(1,B,C,A) move(B-A) 1 号搬到 A Move

9、(B-C) 2号搬到C Hanoi(1,A,B,C) move(A-C) 1 号搬到 C 第3章 限定性线性表 栈和队列 123、213、132、231、321 (312) 2. 设队列中有 直到队列成为空队列为止,则是否可能得到输出序列: 提示: A、B、C、D、E (输出队首元素A) A、 B、C、D、E、A (把队首元素 A插入到队尾) B、 C、D、E、A (删除队首元素A) C、 D、E、A (再次删除队首元素B) C、D、E、A (输出队首元素C) C、 D、E、A、C (把队首元素 C插入到队尾) D、 E、A、C (删除队首元素C) E、 A、C (再次删除队首元素D) 3.

10、给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满? 4. 按照四则运算加、减、乘、除和藉运算(f)优先关系的惯例,画出对下列算术表达式求值时操作数栈和运算 符栈的变化过程: A B * C/D+ E f F 5. 试写一个算法,判断依次读入的一个以 为结束符的字母序列,是否为形如序列 1 & 序列2模式的字符 序列。其中序列1和序列2中都不含字符&且序列2是序列1的逆序列。例如,a+b&b+a 是属该模式 的字符序列,而1 + 3 & 3 1则不是。 提示: 边读边入栈,直到& 6. 假设表达式由单字母变量和双目四则运算算符构成。试

11、写一个算法,将一个 通常书写形式(中缀) 且书写正确 的表达式转换为逆波兰式(后缀)。 提示: 例: 中缀表达式:a+b 后缀表达式:ab + 中缀表达式:a+b xc 后缀表达式:abc x+ 中缀表达式:a+bXc-d 后缀表达式:abc d- (3) A、 A、 C、 E、 C、 C (2) A、 C、 E C、E、 C、C、C (4) A、 C、 E、 C (2) 边读边出栈边比较,直到, 中缀 表达式:a+b Xc-d/e 后缀 表达式:abc x+de/- 中缀表达式:a+b Xc-d)-e/f 后缀 表达式:abcd - +ef/- 后缀表达式的计算过程:(简便) 顺序扫描表达式

12、, (1) 如果是操作数,直接入栈; (2) 如果是操作符op,则连续退栈两次,得操作数 X, Y ,计算X op Y ,并将结果入栈。 * 如何将中缀表达式转换为后缀表达式? 顺序扫描中缀表达式, (1) 如果是操作数,直接输出; (2) 如果是操作符op 2,则与栈顶操作符op 1比较: 如果op 2 op 1,则op 2入栈; 如果op 2 = op 1,则脱括号; 如果op 2 op 1,则输出op 1 ; 7. 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应 的队列初始化、入队列和出队列的算法。 提示: 参P.56 P.70 先画图.

13、 typedef LinkList CLQueue ; int InitQueue( CLQueue * Q) int EnterQueue( CLQueue Q, QueueElementType x) int DeleteQueue( CLQueue Q, QueueElementType *x) 8. 要求循环队列不损失一个空间全部都能得到利用 ,设置一个标志域tag ,以tag为0或1来区分头尾指针相同 时的队列状态的空与满,请编写与此结构相应的入队与出队算法。 提示: 初始状态: front=0, rear=0, tag=0 队空条件: front=rear, tag= 0 队满条件

14、: front=rear, tag= 1 其它状态: front !=rear, tag= 0 (或 1、2) 入队操作: ,(入队) if (front=rear) tag= 1;(或直接 tag= 1) 出队操作: ,(出队) tag= 0; 问题:如何明确区分 队空、队满、非空非满三种情况? 9. 简述以下算法的功能(其中栈和队列的元素类型均为 int) (1) void proc_1(Stack S) ( int i, n, A255; n=0; while(!EmptyStack(S) n+; Pop(&S, &An); for(i=1; i=n; i+) Push(

15、&S, Ai); 将栈S逆序。 ( Stack T; int d; InitStack(&T); while(!EmptyStack(S) ( Pop(&S, &d); if (d!=e) Push( &T, d); while(!EmptyStack(T) ( Pop(&T, &d); Push( &S, d); 删除栈S中所有等于e的元素。 (3) void proc_3(Queue *Q) ( Stack S; int d; InitStack(&S); while(!EmptyQueue(*Q) ( DeleteQ

16、ueue(Q, &d); Push( &S, d); while(!EmptyStack(S) ( Pop(&S, &d); EnterQueue(Q , d) 将队列Q逆序。 实习题 1. 回文判断。称正读与反读都相同的字符序列为“回文”序列。 试写一个算法,判断依次读入的一个以 为结束符的字母序列,是否为形如序列 1 &序列2模式的 字符序列。其中序列 1和序列2中都不含字符&,且序列2是序列1的逆序列。例如,a+b&b+a 是属 该模式的字符序列,而1 +3 & 3 1则不是。 2. 停车场管理。 设停车场是一个可停放 n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场内,汽车按到达的 先后次序,由北向南依次排列(假设大门在最南端)。若车场内已停满 n辆车,则后来的汽车需在门外的便道 上等候,当有车开走时,便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须 先退出车场为它让路,待该辆车开出大门后,其它车辆再按原次序返回车场。每辆车离开停车场时,应按其停 留时间的长短交费(在便道上停留的时间不收费)。 试编写程序,模拟上述管理过程。要求以顺序栈模 拟停车场,以链队列模拟便道。从终端读入汽车到达 或离去的数据,每组数据包括三项:是“到达

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论