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中的JSON使用
Apr 28 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
Python中异常重试的解决方案详解
May 05 Python
一文总结学习Python的14张思维导图
Oct 17 Python
Python IDLE清空窗口的实例
Jun 25 Python
python实现机器学习之元线性回归
Sep 06 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
python如何变换环境
Jul 21 Python
python中return不返回值的问题解析
Jul 22 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
python3实现常见的排序算法(示例代码)
Jul 04 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
CI框架中$this->load->library()用法分析
2016/05/18 PHP
php实现微信支付之退款功能
2018/05/30 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
PHP重载基础知识回顾
2020/09/10 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
javascript event 事件解析
2011/01/31 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
信息专业个人的自我评价
2013/12/27 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
副总经理岗位职责
2014/03/16 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
新手上路标语
2014/06/20 职场文书
招商银行工作证明
2015/06/17 职场文书
运动会加油稿
2015/07/22 职场文书
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers