构与算法 3 栈和队列.pptxVIP

  • 0
  • 0
  • 约2.14千字
  • 约 68页
  • 2018-09-16 发布于江苏
  • 举报
构与算法 3 栈和队列

栈和队列是两种常用的数据类型;2;3;4;练习题;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;则 检验括号是否匹配可用栈来实现。;28;29;算法基于原理: N = (N div d)×d + N mod d;数制转换算法 void Conversion(int N) /*对任意非负十进制数N,打印等值的八进制数*/ { Stack S; int x; /*S为顺序栈或链栈*/ InitStack(S); while(N0) { x=N%8; Push(S, x); N=N/8; } while(!IsEmpty(S)) { Pop(S,x); printf(“%d”,x); } };32;33;34;35; 当在一个函数的运行期间调用另一个函数时, 在运行该被调用函数之前, 需先完成三项任务:; 从被调用函数返回调用函数之前, 应该完成下列三项任务:;多个函数嵌套调用的规则是:;递归工作栈:递归函数执行过程中占用的数据区 工 作 记 录: 每一层的参数、局部变量、返回地 址等构成的记录(数据区) 当前活动记录:栈顶工作记录(当前函数数据区) 当前环境指针:递归工作栈的栈顶指针,指向当前 活动记录。(指示当前函数数据区);例Hanoi塔问题:有3个塔座x, y, z, 在塔座x上插有n个大小不同的圆盘, 从小到大且自上而下编号为1,2,…n; 按规则将它们一个个搬到塔座z上, y可用作辅助塔座。 规则为: (1) 每次只能移动一个圆盘; (2) 圆盘可放在任意塔座上; (3)任何时刻塔座上都不得将大盘压在小盘之上。;void hanoi (int n; char x, char y,char z) /* 将塔座x上按直径由小到大且至上而下编号为1至n的 n个圆盘按规则搬到塔座z上,y可用作辅助塔座。*/ 1 { 2 IF (n==1) 3 move(x, 1, z); /*将1号盘从x移到z*/ 9 } ;void hanoi (int n; char x, char y,char z) 1 { 2 IF (n==1) 3 move(x, 1, z); 4 ELSE { hanoi(n-1, x, z, y); move(x, n, z); hanoi(n-1, y, x, z); 8 } } 调用程序:返回地址为0 hanoi(3, A, B, C); 0 . . . . . .;; 递归程序结构清晰、程序可读性强,且其正确性易于证明,给用户编程带来很大方便。;45;46;47;48;;50;51;52;53; 尽管链队列使用方便,但由于其指针多占存储空间,有时仍需要用顺序结构来表示队列。 ;存储结构定义;56; 当 sq.rearmaxsize 时, 队列满 (即上溢), 但此时头指针指示的元素之前可能还有空单元, 此现象称为假溢出; ;58;59;二、循环队列“空”与“满”的判定;61;62;63;队列的应用举例:;65;void yhsj(int h) { SeqQueue q; QueueElementType e,s; InitQueue(q); EnterQueue(q,0); EnterQueue(q,1); EnterQueue(q,0); for(int i=1;ih;i++){ do{ DeleteQueue(q,s); GetHead(q,e); if (e!=0) printf(%d ,e); else printf(\n); EnterQueue(q,s+e); }while (e!=0); EnterQueue(q,e); } while(!IsEmpty(q)){ Delete

文档评论(0)

1亿VIP精品文档

相关文档