数据结构_堆栈.ppt

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

第四章 堆栈和队列 提纲 4.1堆栈的概念及其运算 4.2堆栈的顺序存储结构 4.3堆栈的链式存储结构 4.4堆栈的应用 4.1堆栈的概念及其运算 堆栈的逻辑结构 堆栈:限定仅在表尾进行插入和删除操作的线性表。 空栈:不含任何数据元素的栈。 允许插入和删除的一端称为栈顶,另一端称为栈底。 4.1堆栈的概念及其运算 4.1堆栈的概念及其运算 4.1堆栈的概念及其运算 4.1堆栈的概念及其运算 4.1堆栈的概念及其运算 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.2堆栈的顺序存储结构 4.3堆栈的链式存储结构 4.3堆栈的链式存储结构 4.3堆栈的链式存储结构 时间性能:相同,都是常数时间O(1)。 空间性能: 顺序栈:有元素个数的限制和空间浪费的问题。 链栈:没有栈满的问题,只有当内存没有可用空间时才会出现栈满,但是每个元素都需要一个指针域,从而产生了结构性开销。 总之,当栈的使用过程中元素个数变化较大时,用链栈是适宜的,反之,应该采用顺序栈。 1 递归的定义 子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。 2 递归的基本思想 问题分解:把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的小问题,直至每个小问题都可以直接解决。 3 递归的要素 递归边界条件:确定递归到何时终止,也称为递归出口; 递归模式:大问题是如何分解为小问题的,也称为递归体。 递归的经典问题——汉诺塔问题 在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔(塔B和塔C)。从世界创始之日起,婆罗门的牧师们就一直在试图把塔A上的碟子移动到塔C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成任务时,世界末日也就到了。 汉诺塔问题的递归求解: 如果 n = 1,则将这一个盘子直接从 塔A移到塔 C 上。否则,执行以下三步: ⑴ 将塔A上的n-1个碟子借助塔C先移到塔B上; ⑵ 把塔A上剩下的一个碟子移到塔C上; ⑶ 将n-1个碟子从塔B借助于塔A移到塔C上。 递归函数的内部执行过程 ⑴ 运行开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址; ⑵ 每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈; ⑶ 每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。 中缀表达式 后缀表达式 后缀表达式特点 后缀表达式中不出现括号 后缀表达式与中缀表达式的运算对象的先后次序相同,只是所读到的运算符的先后次序可能有所改变 后缀表达式实例 ABCE/-E*+ 对应中缀表达式 A+(B-C/D)*E (2)ABCD/F*-E*+X+ 对应中缀表达式A+(B-C/D*F)*E+X 后缀表达式计算算法: Procedure EVAL(E) //E为后缀表达式 top?0 loop x ?NEXT_TOKEN(E) case :x=“#”: return :x=运算对象: call PUSH(STACK,M,top,x) :else: 从堆栈中取出相应的运算对象进行由x执行的运算 并将结果入栈 end forever end 算法思想p81-82 关键点: 运算符堆栈 运算符优先关系表 算法: //将中缀表达式E转换为后缀表达式 Procedure POSTFIX(E) STACK[1]=“#” top?1 loop x ?NEXT_TOKEN(E) case :x=“#”: while top>1 do print(STACK[top]) //输出栈顶运算符 call POP(STATCK,top) //退栈 end print(“#”); return :x是运算对象: print(x) //直接输出运算对象 end forever end :x=“)” : while STACK[top] <>”(“ do print(STATCK[top]) call POP(STACK,top)

文档评论(0)

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

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

1亿VIP精品文档

相关文档