第3章 栈和队列概要1.pptVIP

  1. 1、本文档共64页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3章 栈和队列概要1

(3) 出队操作 Status DeQueue (SqQueue Q, QElemType e) { if (Q. front = = Q. rear) return ERROR; e = Q. base[Q. front]; Q. front = (Q. front + 1) % MAXQSIZE; return OK; } (4) 求队列长度 int QueueLength (SqQueue Q) { return (Q. rear - Q. front + MAXQSIZE) % MAXQSIZE; } * 堆栈溢出: 由于计算机中的内存容量是有限的,所以程序执行堆栈中用来保存活动记录的存储单元的总数有一个上限。如果连续发生多次函数调用产生的活动记录超过了这一上限,将会发生堆栈溢出(stack overflow)错误。 例:n阶Hanoi塔问题:假设有三个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2, …,n的圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列原则: (1) 每次只能移动一个圆盘; (2) 圆盘可以插在X、Y和Z中的任何一个塔座上; (3) 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 如何实现移动圆盘的操作呢? n=1时 1:X - Z n1时 1—(n-1):X - Y n:X - Z 1 —(n-1):Y - Z 如何将n-1个圆盘从一个塔座移至另一个塔座问题是一个和原问题具有相同特征属性的问题,只是问题的规模小个1,因此可以用同样方法求解。 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 */ 4 else { 5 hanoi(n-1,x,z,y); /* 将X上编号为1至n-1的圆盘移到Y,Z作辅助塔 */ 6 move(x,n,z); /* 将编号为n的圆盘从X移到Z */ 7 hanoi(n-1,y,x,z); /* 将Y上编号为1至n-1的圆盘移动到Z, X作辅助塔 */ 8 } 9} 下面给出三个盘子搬动时hanoi(3, A, B, C) 递归调用过程, 如图3.5所示。 hanoi(2,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号搬到C hanoi(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.5 Hanoi塔的递归函数运行示意图 递归的优点 通过上面的例子可看出,递归既是强有力的数学方法, 也是程序设计中一个很有用的工具。其特点是对递归问题描述简捷,结构清晰,程序的正确性容易证明。 递归算法求解问题的要素 递归算法就是算法中有直接或间接调用算法本身的算法。 递归算法的要点如下: (1) 问题具有类同自身的子问题的性质,被定义项在定义中的应用具有更小的尺度。 (2) 被定义项在最小尺度上有直接解。 设计递归算法的方法是: (1) 寻找方法,将问题化为原问题的子问题求解(例n!=n*(n-1)!)。 (2) 设计递归出口,确定递归终止条件(例求解n!时,当n=1时,n! =1)。 递归算法到非递归算法转换 递归算法具有两个特性: (1) 递归算法是一种分而治之、把复杂问题分解为简单问题的求解问题方法,对求解某些复杂问题

文档评论(0)

yaocen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档