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模块学习 re 正则表达式
May 19 Python
python从网络读取图片并直接进行处理的方法
May 22 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
使用python编写监听端
Apr 12 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
python__name__原理及用法详解
Nov 02 Python
Python序列类型的打包和解包实例
Dec 21 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
python爬虫请求头设置代码
Jul 28 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 Python
OpenCV绘制圆端矩形的示例代码
Aug 30 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实现数据分页显示功能
2016/05/26 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
利用javascript解决图片缩放及其优化的代码
2012/05/23 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
python实现简单中文词频统计示例
2017/11/08 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
Python可迭代对象操作示例
2019/05/07 Python
一行python实现树形结构的方法
2019/08/09 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
宿舍标语大全
2014/06/19 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
大学生团员个人总结
2015/02/14 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
学会感恩主题班会
2015/08/12 职场文书
python - asyncio异步编程
2021/04/06 Python