数据结构与算法(Python语言描述)表达式的求值.pptxVIP

数据结构与算法(Python语言描述)表达式的求值.pptx

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

表达式求值 中缀:A+B*(C-D)-E/F 优先级高的运算符先计算; 优先级相同的自左向右计算; 先括号内,后括号外; 后缀:ABCD-*+EF/ 运算符没有优先级,运算次序自左向右; 运算符的两个运算数是其之前的最后两个; 中缀和后缀的表达式 附设运算数栈; 依次读入表达式的每一“项”, 若是数,则将其压栈 若是符,则: 连续从栈中退出两个操作数b和a 计算a 当前符 b 并将计算结果压栈 当表达式处理结束时,栈顶(唯一元素)是计算结果。 后缀表达式的求值 def suffix_evaluator(exp): operators = +-*/ st = SStack() # 存已读入的运算数 for x in exp: if not x in operators: st.push(float(x)) else: b = st.pop() a = st.pop() c = calculate(a, x, b) # 子表达式“归约” st.push(c) return st.top() 后缀表达式求值算法 计算时机:读入新的运算符时,若其优先级比前面最后读入的运算符的优先级低时,则前一个运算符可与当前已读入的最后的两个运算数计算; 两处“最后读入的先处理”(LIFO),故附设两个栈: 运算数栈 运算符栈 中缀表达式的求值 优先级表:C版课本P53。 表示: # y是栈顶符, x是当前读入符 def precede(y, x): if y==‘+’ x==‘+’: # 栈顶的’+’优先级更高! return 1 elif y==‘+’ x==‘-’: return 1 elif y==‘+’ x==‘*’: return -1 …… 优先级的处理方式1 before:入栈前的优先数 after:入栈后的优先数 优先级的处理方式2 操作符 # ( +- * / ^ ) before 0 8 2 4 6 1 after 0 1 3 5 7 不入栈 用两个字典对象 表示! 附设运算数栈和运算符栈; 依次读入表达式的每一“项”, 若是数,则将其压入运算数栈; 若是符,考察最后一个符与当前符的优先级: : 继续读入; : 连续从栈中退出两个操作数b和a; 计算a当前符b; 并将计算结果压入运算数栈; 继续考察; ==: 此时是左右括号碰头,直接弹出左括号;继续读入 当遇到表达式结束符’#’并且运算符的栈顶也为‘#’时,运算数的栈顶(栈底)是计算结果。 【注】:为方便处理,在表达式末尾添加结束符“#” 中缀表达式求值算法 def inffix_evaluator(tokens): operators = “()+-*/“ st_opnd = SStack() # 存已读入的运算数 st_optr = SStack() # 存已读入的运算符 st_optr.push(‘#’) # 总有一个优先级最低的垫底 i = 0; x = tokens[i] while st_optr.top() !=‘#’ x!=‘#’: if x not in operators: str_opnd.push(x) i += 1; x = tokens[i] else: 运算符的处理 return st_opnd.top() 中缀表达式求值算法 y = st_optr.top() if after[y] before[x]: # 方式1:precede(y, x) == 1 st_optr.push(x) i += 1; x = tokens[i] elif after[y] before[x]: y = st_optr.pop() b = st_opnd.pop() a = st_opnd.pop() c = calculate(a, y, b) # 继续处理x,而不是读入新的x else: st_optr.pop() # 此时是左右括号碰头,弹出左括号 i += 1; x = tokens[i] 运算符的处理 后缀表达式操作数的排列次序同中缀表达式 故不需附设栈存运算数,遇数则直接输出; 运算符的输出时机同中缀表达式的计算时机; 附设栈保存以读入但未处理的运算符; 输出时机:当前符的优先级低于符栈栈

文档评论(0)

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

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

1亿VIP精品文档

相关文档