- 1、本文档共96页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构 第二版第3章PPT
1) 消除递归的原因 其一:有利于提高算法时空性能,因为递归执行时需要系统提供隐式栈实现递归,效率低且费时。 其二: 无应用递归语句的语言设施环境条件,有些计算机语言不支持递归功能,如FORTRAN、 C语言中无递归机制 。 其三:递归算法是一次执行完,这在处理有些问题时不合适, 也存在一个把递归算法转化为非递归算法的需求。 2) 简单递归(尾递归和单向递归)消除 在简单情况下, 将递归算法可简化为线性序列执行, 可直接转换为循环实现。 例:斐波那契数列 图3.11 Fib(5)递归调用过程示意 intFib(intn) { if(n==0||n==1)return n; /*递归出口*/ else return Fib(n-1)+Fib(n-2); /*递归调用*/ } 图3.11中的15个点表示15次运算。如果合并重合点,按图3.12所示粗黑线循环实现计算,共需进行5次运算。 图3.12 Fib(5)循环调用过程示意 1) 无括号算术表达式求值 表达式计算 程序设计语言中都有计算表达式的问题, 这是语言编译中的典型问题。 (1) 表达式形式: 由运算对象、 运算符及必要的表达式括号组成; (2) 表达式运算: 运算时要有一个正确的运算形式顺序。 由于某些运算符可能具有比别的运算符更高的优先级,因此表达式不可能严格的从左到右, 见图3.5。 图3.5 表达式运算及运算符优先级 图3.6 无括号算术表达式的处理过程 2) 算术表达式处理规则 (1) 规定优先级表。 (2) 设置两个栈: OVS(运算数栈)和OPTR(运算符栈)。 (3) 自左向右扫描,遇操作数进OVS,遇操作符则与OPTR栈顶优先数比较:当前操作符OPTR栈顶, 当前操作符进OPTR栈当前操作符≤OPTR栈顶,OVS栈顶、次顶和OPTR栈顶,退栈形成运算T(i),T(i)进OVS栈。 例: 实现A/B↑C+D*E#的运算过程时栈区变化情况如图3.7所示。 图3.7 A/B↑C+D*E运算过程的栈区变化情况示意图 3) 带括号算术表达式 假设操作数是整型常数,运算符只含加、减、乘、除等四种运算符, 界限符有左右括号和表达式起始、结束符“#”,如: #(7+15)*(23-28/4)#。 引入表达式起始、 结束符是为了方便。 要对一个简单的算术表达式求值, 首先要了解算术四则运算的规则, 即: (1) 从左算到右; (2) 先乘除, 后加减; (3) 先括号内, 后括号外。 运算符和界限符可统称为算符,它们构成的集合命名为OPS。根据上述三条运算规则,在运算过程中,任意两个前后相继出现的算符θ1和θ2之间的优先关系必为下面三种关系之一: θ1θ2, θ1的优先权低于θ2。 θ1=θ2, θ1的优先权等于θ2。 θ1θ2, θ1的优先权高于θ2。 表 3-1 算符之间的优先关系 实现算符优先算法时需要使用两个工作栈: 一个称作operator, 用以存放运算符;另一个称作operand,用以存放操作数或运算的中间结果。 算法的基本过程如下: 首先初始化操作数栈operand和运算符栈operator, 并将表达式起始符“#”压入运算符栈; 依次读入表达式中的每个字符,若是操作数则直接进入操作数栈operand, 若是运算符,则与运算符栈operator的栈顶运算符进行优先权比较,并做如下处理: (1) 若栈顶运算符的优先级低于刚读入的运算符, 则让刚读入的运算符进operator栈; (2) 若栈顶运算符的优先级高于刚读入的运算符,则将栈顶运算符退栈,送入θ,同时将操作数栈operand退栈两次,得到两个操作数a、b,对a、 b进行θ运算后, 将运算结果作为中间结果推入operand栈; (3) 若栈顶运算符的优先级与刚读入的运算符的优先级相同,说明左右括号相遇,只需将栈顶运算符(左括号)退栈即可。 算法具体描述如下: int ExpEvaluation() /*读入一个简单算术表达式并计算其值。 operator和operand分别为运算符栈和运算数栈, OPS为运算符集合*/ { InitStack(operand); InitStack(operato
文档评论(0)