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 相关文章推荐
python3.0 字典key排序
Dec 24 Python
Python中使用 Selenium 实现网页截图实例
Jul 18 Python
Python中利用sqrt()方法进行平方根计算的教程
May 15 Python
详解Python中time()方法的使用的教程
May 22 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
解决python3 json数据包含中文的读写问题
May 10 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
Python中collections模块的基本使用教程
Dec 07 Python
python求绝对值的三种方法小结
Dec 04 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
Jun 04 Python
Python操作Word批量生成合同的实现示例
Aug 28 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维护文件系统
2006/10/09 PHP
一个程序下载的管理程序(二)
2006/10/09 PHP
php结合ajax实现赞、顶、踩功能实例
2014/05/12 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
koa-router源码学习小结
2018/09/07 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
vue实现学生信息管理系统
2020/05/30 Javascript
Python三级目录展示的实现方法
2016/09/28 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
python实现从ftp上下载文件的实例方法
2020/07/19 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
学院领导推荐信
2013/10/30 职场文书
主题教育活动总结
2014/05/05 职场文书
小学节能减排倡议书
2014/05/15 职场文书
五四演讲稿范文
2014/09/03 职场文书
图书馆义工感想
2015/08/07 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书