python实现逆波兰计算表达式实例详解


Posted in Python onMay 06, 2015

本文实例讲述了python实现逆波兰计算表达式的方法。分享给大家供大家参考。具体分析如下:

逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。

# -*- coding: utf-8 -*-
symbol_priority = {}
symbol_priority[0] = ['#']
symbol_priority[1] = ['(']
symbol_priority[2] = ['+', '-']
symbol_priority[3] = ['*', '/']
symbol_priority[4] = [')']
def comparePriority(symbol, RPN_stack, symbol_stack):
  '''Compare priority between two symbols'''
  global symbol_priority
  if len(symbol_stack) > 0:
    symbol_pop = symbol_stack.pop()
  else:
    return
  for list in symbol_priority.values():
    if (symbol in list) and (symbol_pop in list):
      '''same priority'''
      symbol_stack.append(symbol_pop)
      symbol_stack.append(symbol)
      return
    elif symbol in list:
      '''symbol is smaller'''
      RPN_stack.append(symbol_pop)
      #recusion call
      comparePriority(symbol, RPN_stack, symbol_stack)
      return
    elif symbol_pop in list:
      '''symbol is bigger'''
      symbol_stack.append(symbol_pop)
      symbol_stack.append(symbol)
      return
    else:
      continue
    symbol_stack.append(symbol_pop)
    return
def scanEveryone(input_string, RPN_stack, symbol_stack):
  for ch in input_string:
    if ch.isdigit():
      RPN_stack.append(ch)
    else:
      if len(symbol_stack) > 0:
        if ch == '(':
          symbol_stack.append(ch)
        elif ch == ')':
          while True:
            symbol_pop = symbol_stack.pop()
            if symbol_pop == '(':
              break
            else:
              RPN_stack.append(symbol_pop)
        else:
          comparePriority(ch, RPN_stack, symbol_stack)
      else:
        symbol_stack.append(ch)
def scanInput(RPN_stack, symbol_stack):
  input_string = raw_input()
  input_string += '#'
  scanEveryone(input_string, RPN_stack, symbol_stack)
def calRPN(RPN_stack):
  value_stack = []
  RPN_stack.append('#')
  for value in RPN_stack:
    if value == '#':
      return value_stack.pop()
      break
    if value.isdigit():
      value_stack.append(value)
    else:
      right_value = value_stack.pop()
      left_value = value_stack.pop()
      cal_string = left_value + value + right_value
      value_stack.append(str(eval(cal_string)))
def main():
  RPN_stack = []
  symbol_stack = []
  scanInput(RPN_stack, symbol_stack)
  print calRPN(RPN_stack)
if __name__ == '__main__':
  main()

calRPN.py

# -*- coding: utf-8 -*-
symbol_priority = {}
symbol_priority[0] = ['#']
symbol_priority[1] = ['(']
symbol_priority[2] = ['+', '-']
symbol_priority[3] = ['*', '/']
symbol_priority[4] = [')']
def comparePriority(symbol, RPN_stack, symbol_stack):
  '''Compare priority between two symbols'''
  global symbol_priority
  if len(symbol_stack) > 0:
    symbol_pop = symbol_stack.pop()
  else:
    return
  for list in symbol_priority.values():
    if (symbol in list) and (symbol_pop in list):
      '''same priority'''
      symbol_stack.append(symbol_pop)
      symbol_stack.append(symbol)
      return
    elif symbol in list:
      '''symbol is smaller'''
      RPN_stack.append(symbol_pop)
      #recusion call
      comparePriority(symbol, RPN_stack, symbol_stack)
      return
    elif symbol_pop in list:
      '''symbol is bigger'''
      symbol_stack.append(symbol_pop)
      symbol_stack.append(symbol)
      return
    else:
      continue
    symbol_stack.append(symbol_pop)
    return
def scanEveryone(input_string, RPN_stack, symbol_stack):
  for ch in input_string:
    if ch.isdigit():
      RPN_stack.append(ch)
    else:
      if len(symbol_stack) > 0:
        if ch == '(':
          symbol_stack.append(ch)
        elif ch == ')':
          while True:
            symbol_pop = symbol_stack.pop()
            if symbol_pop == '(':
              break
            else:
              RPN_stack.append(symbol_pop)
        else:
          comparePriority(ch, RPN_stack, symbol_stack)
      else:
        symbol_stack.append(ch)
def scanInput(RPN_stack, symbol_stack):
  input_string = raw_input()
  input_string += '#'
  scanEveryone(input_string, RPN_stack, symbol_stack)
def calRPN(RPN_stack):
  value_stack = []
  RPN_stack.append('#')
  for value in RPN_stack:
    if value == '#':
      return value_stack.pop()
      break
    if value.isdigit():
      value_stack.append(value)
    else:
      right_value = value_stack.pop()
      left_value = value_stack.pop()
      cal_string = left_value + value + right_value
      value_stack.append(str(eval(cal_string)))
def main():
  RPN_stack = []
  symbol_stack = []

  scanInput(RPN_stack, symbol_stack)
  print calRPN(RPN_stack)
if __name__ == '__main__':
  main()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
PyQt5每天必学之事件与信号
Apr 20 Python
详解Python中的四种队列
May 21 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 Python
python构造IP报文实例
May 05 Python
python类共享变量操作
Sep 03 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
May 06 #Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 #Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 #Python
Python实现的HTTP并发测试完整示例
Apr 23 #Python
安装dbus-python的简要教程
May 05 #Python
使用SAE部署Python运行环境的教程
May 05 #Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
May 05 #Python
You might like
php实例分享之html转为rtf格式
2014/06/02 PHP
PHP防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
python实现音乐下载的统计
2018/06/20 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
Python读取YAML文件过程详解
2019/12/30 Python
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
迷你西餐厅创业计划书范文
2013/12/31 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
安全生产投入制度
2014/01/29 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
物理学专业求职信
2014/07/04 职场文书
一般党员对照检查材料
2014/09/24 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
入党政审材料范文
2014/12/24 职场文书