- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构与算法(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),故附设两个栈:运算数栈运算符栈优先级的处理方式1优先级表:C版课本P53。表示: # y是栈顶符, x是当前读入符 def precede(y, x): if y==‘+’ x==‘+’:# 栈顶的’+’优先级更高! return 1 elif y==‘+’ x==‘-’: return 1 elif y==‘+’ x==‘*’: return -1…… 优先级的处理方式2操作符# ( +-* / ^ )before 082 4 61after 0 135 7不入栈用两个字典对象表示!before:入栈前的优先数after:入栈后的优先数中缀表达式求值算法附设运算数栈和运算符栈;依次读入表达式的每一“项”,若是数,则将其压入运算数栈;若是符,考察最后一个符与当前符的优先级:: 继续读入;: 连续从栈中退出两个操作数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] 中缀表达式转换为后缀表达式后缀表达式操作数的排列次序同中缀表达式故不需附设栈存运算数,遇数则直接输出;运算符的输出时机同中缀表达式的计算时机;附设栈保存以读入但未处理的运算符;输出时机:当前符的优先级低于符栈栈顶运算符时,栈顶运算符可输出。中缀表达式转换为后缀表达式算法伪码def inffix_to_suffix(tokens): operators = “()+-*/“ st_optr = SStack()# 存已读入的运算符 exp = [] st_optr.push(‘#’)# 总有一个优先级最低的垫底 i = 0; x = tokens[i] while st_optr.top() !=‘#’ x!=‘#’: if x not in operators: exp.append(x) i += 1; x = tokens[
文档评论(0)