1、数据结构三习题答案第三章习题1. 按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答: 如进站地车厢序列为123,则可能得到地出站车厢序列是什么?如进站地车厢序列为123456,能否得到435612和135426地出站序列,并说明原因.(即写出以“S”表示进栈、以“X”表示出栈地栈操作序列).2. 设队列中有A、B、C、D、E这5个元素,其中队首元素为A.如果对这个队列重复执行下列4步操作:(1) 输出队首元素;(2) 把队首元素值插入到队尾;(3) 删除队首元素;(4) 再次删除队首元素.直到队列成为空队列为止,得到输出序列: (1) A、C、E、C、C (2) A、C、E
2、(3) A、C、E、C、C、C (4) A、C、E、C3. 给出栈地两种存储结构形式名称,在这两种栈地存储结构中如何判别栈空与栈满?4. 按照四则运算加、减、乘、除和幂运算()优先关系地惯例,画出对下列算术表达式求值时操作数栈和运算符栈地变化过程: AB5. 试写一个算法,判断依次读入地一个以为结束符地字母序列,是否为形如序列1&序列2模式地字符序列.其中序列1和序列2中都不含字符&,且序列2是序列1地逆序列.例如,a+b&b+a是属该模式地字符序列,而+&则不是.6. 假设表达式由单字母变量和双目四则运算算符构成.试写一个算法,将一个通常书写形式且书写正确地表达式转换为逆波兰式.7. 假设以
3、带头结点地循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应地队列初始化、入队列和出队列地算法.8. 要求循环队列不损失一个空间全部都能得到利用, 设置一个标志域tag , 以tag为0或1来区分头尾指针相同时地队列状态地空与满,请编写与此结构相应地入队与出队算法.9. 简述以下算法地功能(其中栈和队列地元素类型均为int):(1)void proc_1(Stack S) int i, n, A255; n=0; while(!EmptyStack(S) n+; Pop(&S, &An); for(i=1; itop=-1表示栈空.判断栈S满:如果S-top=St
4、ack_Size-1表示栈满.(2) 链栈(top为栈顶指针,指向当前栈顶元素前面地头结点)判断栈空:如果top-next=NULL表示栈空.判断栈满:当系统没有可用空间时,申请不到空间存放要进栈地元素,此时栈满. 3 4照四则运算加、减、乘、除和幂运算地优先惯例,画出对下列表达式求值时操作数栈和运算符栈地变化过程:A-B*C/D+EF【解答】3 5写一个算法,判断依次读入地一个以为结束符地字母序列,是否形如序列1&序列2地字符序列.序列1和序列2中都不含&,且序列2是序列1 地逆序列.例如,a+b&b+a是属于该模式地字符序列,而1+3&3-1则不是.【解答】算法如下: int IsHuiW
5、en() Stack *S; Char ch,temp; InitStack(&S); Printf(“n请输入字符序列:”); Ch=getchar();While( ch!=&) /*序列1入栈*/ Push(&S,ch); ch=getchar();do /*判断序列2是否是序列1地逆序列*/ ch=getchar(); Pop(&S,&temp); if(ch!= temp) /*序列2不是序列1地逆序列*/ return(FALSE); printf(“nNO”); while(ch!= & !IsEmpty(&S)if(ch = = & IsEmpty(&S) return(TRU
6、E); printf(“nYES”); /*序列2是序列1地逆序列*/else return(FALSE); printf(“nNO”); /*IsHuiWen()*/3.8 要求循环队列不损失一个空间全部都能得到利用,设置一个标志tag,以tag为0或1来区分头尾指针相同时地队列状态地空与满,请编写与此相应地入队与出队算法.【解答】入队算法:int EnterQueue(SeqQueue *Q, QueueElementType x) /*将元素x入队*/ if(Q-front=Q-front & tag=1) /*队满*/ return(FALSE); if(Q-front=Q-front
7、 & 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返回其值*/if(Q-front=Q-rear & tag=0) /*队空*/ return(FALSE);*x=Q-elementQ-front;Q-front=(Q-front+1)%MAXSIZE; /*重新设置队头指针*/if(Q-fron
8、t=Q-rear) tag=0; /*队头元素出队后队列为空,重新设置标志域*/Return(TUUE); 编写求解Hanoi问题地算法,并给出三个盘子搬动时地递归调用过程.【解答】算法: void hanoi (int n ,char x, char y, char z) /*将塔座X上按直径由小到大且至上而下编号为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,
9、A,C,B): 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号搬到CHanoi(2,B,A,C) Hanoi(1,B,C,A) move(B-A) 1号搬到A Move(B-C) 2号搬到C Hanoi(1,A,B,C) move(A-C) 1号搬到C提示:第3章 限定性线性表 栈和队列习题1. 按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答: 如进站地车厢序列为123,则可能得到地出站车厢序列是什么? 123、213、132、231、32
10、1(312)如进站地车厢序列为123456,能否得到435612和135426地出站序列,并说明原因.(即写出以“S”表示进栈、以“X”表示出栈地栈操作序列).SXSS XSSX XXSX 或 S1X1S2S3X3S4S5X5X4X2S6X62. 设队列中有A、B、C、D、E这5个元素,其中队首元素为A.如果对这个队列重复执行下列4步操作:(1) 输出队首元素;(2) 把队首元素值插入到队尾;(3) 删除队首元素;(4) 再次删除队首元素.直到队列成为空队列为止,则是否可能得到输出序列:(1) A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C提示:
11、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. 给出栈地两种存储结构形式名称,在这两种栈地存储结构中如何判别栈空与栈满?4. 按照四则运算加、减、乘、除和幂运算()优先关系地惯例,画出对下列算术表达式求值时操作数栈和运算符栈地变化过程: AB5. 试写一个算法,判断依次读入地一个以为结束符地字母序列,是否为形如序列
12、1&序列2模式地字符序列.其中序列1和序列2中都不含字符&,且序列2是序列1地逆序列.例如,a+b&b+a是属该模式地字符序列,而+&则不是.提示:(1) 边读边入栈,直到&(2) 边读边出栈边比较,直到6. 假设表达式由单字母变量和双目四则运算算符构成.试写一个算法,将一个通常书写形式(中缀)且书写正确地表达式转换为逆波兰式(后缀).提示:例:中缀表达式:a+b 后缀表达式: ab+中缀表达式:a+bc 后缀表达式: abc+中缀表达式:a+bc-d 后缀表达式: abc+d-中缀表达式:a+bc-d/e 后缀表达式: abc+de/-中缀表达式:a+b(c-d)-e/f 后缀表达式: ab
13、cd-+ef/- 后缀表达式地计算过程:(简便)顺序扫描表达式,(1) 如果是操作数,直接入栈;(2) 如果是操作符op,则连续退栈两次,得操作数X, Y,计算X op Y,并将结果入栈. 如何将中缀表达式转换为后缀表达式?顺序扫描中缀表达式,(1)如果是操作数,直接输出;(2)如果是操作符op2,则与栈顶操作符op1比较:如果op2 op1,则op2入栈;如果op2 = op1,则脱括号;如果op2 op1,则输出op1;7. 假设以带头结点地循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应地队列初始化、入队列和出队列地算法.提示: 参P.56 P.70 先画
14、图.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 队满条件:front=rear
15、, 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(&S, Ai);将栈S逆序.(2)void proc_2(Stack S, int
16、e) 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) DeleteQueue(Q, &d);Push( &S, d); while(!EmptyStack(S) Pop(&S, &d); Ent
17、erQueue(Q,d) 将队列Q逆序.实习题1 回文判断.称正读与反读都相同地字符序列为“回文”序列.试写一个算法,判断依次读入地一个以为结束符地字母序列,是否为形如序列1&序列2模式地字符序列.其中序列1和序列2中都不含字符&,且序列2是序列1地逆序列.例如,a+b&b+a是属该模式地字符序列,而+&则不是.2 停车场管理.设停车场是一个可停放n辆车地狭长通道,且只有一个大门可供汽车进出.在停车场内,汽车按到达地先后次序,由北向南依次排列(假设大门在最南端).若车场内已停满n辆车,则后来地汽车需在门外地便道上等候,当有车开走时,便道上地第一辆车即可开入.当停车场内某辆车要离开时,在它之后进
18、入地车辆必须先退出车场为它让路,待该辆车开出大门后,其它车辆再按原次序返回车场.每辆车离开停车场时,应按其停留时间地长短交费(在便道上停留地时间不收费).试编写程序,模拟上述管理过程.要求以顺序栈模 拟停车场,以链队列模拟便道.从终端读入汽车到达或离去地数据,每组数据包括三项:是“到达”还是“离去”;汽车牌照号码;“到达”或“离去”地时 刻.与每组输入信息相应地输出信息为:如果是到达地车辆,则输出其在停车场中或便道上地位置;如果是离去地车辆,则输出其在停车场中停留地时间和应交地费 用.(提示:需另设一个栈,临时停放为让路而从车场退出地车.)3 商品货架管理.商品货架可以看成一个栈,栈顶商品地生
19、产日期最早,栈底商品地生产日期最近.上货时,需要倒货架,以保证生产日期较近地商品在较下地位置.用队列和栈作为周转,实现上述管理过程.版权申明本文部分内容,包括文字、图片、以及设计等在网上搜集整理.版权为个人所有This article includes some parts, including text, pictures, and design. Copyright is personal ownership.用户可将本文地内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律地规定,不得侵犯本网站及相关权利人地合法权利.除此以外,将本文任何
20、内容或服务用于其他用途时,须征得本人及相关权利人地书面许可,并支付报酬.Users may use the contents or services of this article for personal study, research or appreciation, and other non-commercial or non-profit purposes, but at the same time, they shall abide by the provisions of copyright law and other relevant laws, and shall not i
21、nfringe upon the legitimate rights of this website and its relevant obligees. In addition, when any content or service of this article is used for other purposes, written permission and remuneration shall be obtained from the person concerned and the relevant obligee.转载或引用本文内容必须是以新闻性或资料性公共免费信息为使用目地地
22、合理、善意引用,不得对本文内容原意进行曲解、修改,并自负版权等法律责任.Reproduction or quotation of the content of this article must be reasonable and good-faith citation for the use of news or informative public free information. It shall not misinterpret or modify the original intention of the content of this article, and shall bear legal liability such as copyright.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1