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中使用SAX解析xml实例
Nov 21 Python
Python随机数用法实例详解【基于random模块】
Apr 18 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
简单实现python数独游戏
Mar 30 Python
Python之pandas读写文件乱码的解决方法
Apr 20 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 Python
Django admin model 汉化显示文字的实现方法
Aug 12 Python
python如何删除文件、目录
Jun 23 Python
python语言实现贪吃蛇游戏
Nov 13 Python
Python基础教程,Python入门教程(超详细)
Jun 24 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
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
杨氏矩阵查找的JS代码
2013/03/21 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
python中的对象拷贝示例 python引用传递
2014/01/23 Python
记录Django开发心得
2014/07/16 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
Python中实现switch功能实例解析
2018/01/11 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
Python对象的属性访问过程详解
2020/03/05 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
个性大学生自我评价
2013/12/04 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
党员证明模板
2015/06/19 职场文书
高二英语教学反思
2016/03/03 职场文书
公司与个人合作协议书
2016/03/19 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python
java设计模式--七大原则详解
2021/07/21 Java/Android
golang语言指针操作
2022/04/14 Golang