网站大量收购独家精品文档,联系QQ:2885784924

顺序队列39队列的物理结构——循环-浙江工商大学.PPT

顺序队列39队列的物理结构——循环-浙江工商大学.PPT

  1. 1、本文档共67页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
顺序队列39队列的物理结构——循环-浙江工商大学

3.9 队列的物理结构——循环(顺序)队列 3.9.5 操作的实现 链队列 循环顺序队列(方式一) InitQueue(Q) Q-front=malloc(sizeof (LinkQueueNode)); Q-front=Q-rear=0; QueueEmpty(Q) return(Q-rear==Q-front); return(Q-rear==Q-front); QueueFull(Q) 无 return((Q-rear+1)%MAXSIZE ==Q-front); QueueFront(S) return Q-front-next-data; return Q-elem[Q-front]; EnterQueue(Q,x) 分配空间,赋值,修改当前队尾指针 判断是否满 Q-elem[Q-rear]=x; Q-rear=(Q-rear+1)%MAXSIZE; DeleteQueue(S, x) 判断是否空,保存值到x,修改当前队头指针 判断是否空 *x= S-elem[S-front]; Q-front=(Q-front+1)%MAXSIZE; 10. 队列的应用 3.10 队列的应用 3.10.1 背景 杨辉三角的打印 特点:每一行的第一个元素和最后一个元素均为1,其他位置上的数字是其上一行中与之相邻的两个整数之和 3.10 队列的应用 3.10.2 算法思想 队列头 队列尾 1出队并打印 1+3=4 4入队 显示数据只能从上到下,从左到右逐个进行,不能回溯。 如果用队列存储数据,出队列的数据一边显示,一边与后面的数据相加产生下一行数据,并把产生的数据放入队列。 总结 3.5 栈的应用 3.5.4 表达式求解 比如,A/B↑C+D*E#运算过程的栈变化情况如下所示: 3.5 栈的应用 3.5.4 表达式求解 比如,A/B↑C+D*E#运算过程的栈变化情况如下所示: 3.5 栈的应用 3.5.4 表达式求解 比如,A/B↑C+D*E#运算过程的栈变化情况如下所示: 3.5 栈的应用 3.5.4 表达式求解 比如,A/B↑C+D*E#运算过程的栈变化情况如下所示: 3.5 栈的应用 3.5.5 行编辑 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入一个栈。允许用户输入出错时可以及时更正。 可以约定#为退格符,以表示前一个字符无效,@为退行符,表示当前行所有字符均无效。 例:在终端上用户输入为 whli##ilr#e(s#*s) 应为 while(*s) 6. 递归和栈 3.6 递归和栈 3.6.1 背景 Hanoi塔/汉诺塔/河内塔问题 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 3.6 递归和栈 3.6.1 背景 Hanoi塔/汉诺塔/河内塔问题 假如移动一次要1秒, 计算表明移完这些金片需要5845亿年以上(搬动次数为2^64-1,约为16*10^18次),而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。 Hanoi塔问题能够用递归算法表达,假如用2.4GHz的CPU,每3个时钟周期计算一步,则需要2*10^10秒(2.4G/3是8*10^8),也就是634年。 3.6 递归和栈 3.6.2 递归的定义 递归算法就是直接或者间接地调用自己的算法。 所谓间接调用,比如函数A调用函数B,函数B调用A。 递归的原理是把问题转化为规模缩小了的同类问题。 在递归时,需要 不断把本次调用的状态数据(当前局部变量值、当前函数形参值、返回地址)保存起来,进入更低一层的调用,直到问题不能分解为止。 然后再逐个把保存的各次调用的状态数据按照“先进后出”取出来。 因此递归算法的求解也符合栈的特点。 3.6 递归和栈 3.6.2 写递归算法 全局可以分解成若干个局部,而局部和全局具有相似性 要定义好出口(即不再继续分解的情况)。 void hanoi(int n,char x,char y,char z) { if(n==1) move(x,1,z); // 将编号为1的圆盘从X移到Z else { hanoi(n-1,x,z,y); // 将X上编号为1至n-1的圆盘移到Y move(x,n,z); // 将编号为n的圆盘从X移到Z hanoi(n-1,y,x

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档