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 相关文章推荐
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
Nov 16 Python
Python实现求两个csv文件交集的方法
Sep 06 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
有关Python的22个编程技巧
Aug 29 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
Python pip替换为阿里源的方法步骤
Jul 02 Python
django页面跳转问题及注意事项
Jul 18 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
利用Python脚本实现自动刷网课
Feb 03 Python
解决Python安装cryptography报错问题
Sep 03 Python
Python中用xlwt制作表格实例讲解
Nov 05 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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
E路文章系统PHP
2006/12/11 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
php中session使用示例
2014/03/29 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
vue写一个组件
2018/04/09 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
Python面向对象之类的内置attr属性示例
2018/12/14 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
审计工作个人的自我评价
2013/12/25 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
节约用电倡议书
2015/04/28 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技