从本节开始,删除原版的英文,直接发译后的文稿。

后缀表达式求值

栈的最一个应用例子,计算一个后缀表达式的值。这个例子中仍然用栈的数据结构。不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中那样让操作符等待。另一条思路是,无论何时看到输入一个操作符,最近的两个操作数就是操作对象。

为了说清楚一点,考虑表达式4 5 6 * +。从左到右扫描时,首先得到4和5,不过此时,并不知道怎样处理这两个数,直到看到后面的操作符。所以要把这两个数先压栈,得到操作符以后再出栈。

这个例子中,下一个符号仍然是操作数,所以照旧压栈,并检查下一个。现在看到操作符*,这意味着最近两个操作数要用来做乘法。出栈两次,得到两个操作数并相乘(在本例中是结果是30)

这个计算结果要压回到栈内,并作为下一个操作符的对象。当最后一个操作符工作结束,栈内应该只有一个数值,出栈并作为计算结果返回。图10显示了这个求值过程中,栈内容的变化。

图11显示了一个稍微复杂的表达式求值过程。7 8 + 3 2 + /。这个例子中有两点要注意。第一,栈的大小,随着子表达式的计算过程而膨胀,收缩,再膨胀。第二,除法操作符要小心处理,因为后缀表达式的操作数顺序不变,但当两个操作数出栈时,顺序反了。因为除法不支持交换律,所以15/5与5/15不同,必须保证顺序没有交错。

算法假定后缀表达式是一系列被空格分隔的字符,操作符是* /+ -,操作数假定是一位整数。最终结果也是整数。

1

建立一个空栈,operandStack

2

字符串使用split转为列表

3

从左到右检索列表

如果是操作数,字符转为整数,压栈

如果是操作符,出栈两次。第一次出栈的是第二个操作数,第二次出栈的是第一个操作数。计算结果,并压回栈。

4

检索结束,出栈结果就是返回值。

完整的函数代码如下,其中的doMath是算法辅助函数,定义为两个操作数和一个操作符的计算。

from pythonds.basic.stack import Stack

def postfixEval(postfixExpr):

operandStack = Stack()

tokenList =postfixExpr.split()

for token in tokenList:

if token in"0123456789":

operandStack.push(int(token))

else:

operand2 =operandStack.pop()

operand1 =operandStack.pop()

result =doMath(token,operand1,operand2)

operandStack.push(result)

return operandStack.pop()

def doMath(op, op1, op2):

if op == "*":

return op1 * op2

elif op == "/":

return op1 / op2

elif op == "+":

return op1 + op2

else:

return op1 - op2

print(postfixEval(‘7 8 + 3 2 + /‘))

原文:http://blog.csdn.net/python2014/article/details/21342223

python前缀表达式求值_python数据结构与算法 11 后缀表达式求值相关推荐

  1. 有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果

    有趣的数据结构算法10--后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果 解题思路 实现代码 GITHUB下载连接 在前一天已经利用栈完成2进制到8进制的转换.但是栈的应用方面还有很多,本次我将 ...

  2. Python实现相空间重构求关联维数——GP算法、自相关法求时间延迟tau、最近邻算法求嵌入维数m

    Python实现相空间重构求关联维数--GP算法.自相关法求时间延迟tau.最近邻算法求嵌入维数m GP算法: 若有一维时间序列为{x1,x2,-,xn},对其进行相空间重构得到高维相空间的一系列向量 ...

  3. 中缀表达式X=A+B*(C-(D+F))/E转后缀表达式之后是什么?

    中缀表达式X=A+B*(C-(D+F))/E转后缀表达式之后是什么? ABCDF+-*E/+ ABDF+C-*E/+ ABDF+C*-E/+ ABDF+C*-E+/ 正确答案:A A+B*(C-(D+ ...

  4. python 表达式求值数据结构_python 数据结构与算法

    python 数据结构与算法 1 python常见数据结构性能 1.1 List 1.1.1 安索引取值和赋值 1.1.2 列表append和__add__() 1.1.3 使用timeit模块测试执 ...

  5. php表达式求值,PHP实现基于栈的后缀表达式求值功能

    本文实例讲述了PHP实现基于栈的后缀表达式求值功能.分享给大家供大家参考,具体如下: 后缀表达式概述 后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左 ...

  6. python函数结构图_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  7. python程序结构有哪几种_Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...

  8. python数据结构算法优势_Python数据结构与算法(一)----- 算法效率

    一.引入 先来看一道题: 如果a+b+c=1000, 且a2+b2=c^2(a,b,c为自然数),如何求出所有a,b,c可能的组合? (1) 枚举法 import time start_time = ...

  9. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

最新文章

  1. 为了智能驾驶,李彦宏要改造城市道路
  2. ORACLE 12C PDB部分功能测试
  3. Git 远程分支的pull与push
  4. finished with exit code -1073740791 (0xC0000409)
  5. 大部分人都会忽略的Python易错点总结
  6. Android零基础入门第24节:自定义View简单使用
  7. pywin32 获取窗口句柄_Excel VBA | 这个窗口居然关不掉
  8. 管壁式换热器cad图纸_民勤图纸管板加工加工
  9. squid安装和配置(centos6.5)
  10. OAuth: How and Why?
  11. 湖州市技师学院的计算机,湖州技师学院
  12. 多个图像直方图合并matlab,MATLAB图像处理之直方图匹配(图像合理增强)
  13. 《图书管理系统》需求分析
  14. 1317: PIPI的生日礼物
  15. 乌卡时代下,企业供应链管理体系的应对策略
  16. 高性能网站建设进阶指南:Web开发者性能优化最佳实践 pdf扫描版
  17. springboot+hutool批量生成二维码压缩导出
  18. 音频播放器—打开音频设备(扬声器)
  19. 添加Adobe PDF 打印机
  20. 扫描器可发现远程服务器,服务器扫描发现漏洞-可通过HTTP获取远端WWW服务信息...

热门文章

  1. .net通过一般处理程序模拟用户控件数据保持、Ispostback 【第二版将html与ashx文件分开】...
  2. 设计模式之四:适配器模式(Adapter Pattern)
  3. 需求分析师的工作重点
  4. iPhone手机获取uuid 安装测试app
  5. uniapp商城_【程序源代码】商城小程序
  6. python3怎么创建一个链表_怎么创建一个自己的微信公众号
  7. c语言设备管理系统实训答辩,C语言设计(力学实验设备管理系统)1答辩.doc
  8. rabbitmq python amqp user_python 与rabbitmq
  9. envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
  10. 发送结构化的网络消息