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实现合并字典的方法
Jul 07 Python
深入理解Python对Json的解析
Feb 14 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
pygame实现非图片按钮效果
Oct 29 Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 Python
python实现斗地主分牌洗牌
Jun 22 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
pycharm代码删除恢复的方法
Jun 26 Python
python中数组和列表的简单实例
Mar 25 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 递归效率分析
2009/11/24 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
2016/12/28 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
python写入已存在的excel数据实例
2018/05/03 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
Django 用户登陆访问限制实例 @login_required
2020/05/13 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
国际领先的学术出版商:Springer
2017/01/11 全球购物
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
安全生产奖惩制度
2015/08/06 职场文书
2019军训心得体会
2019/06/27 职场文书
Python Django ORM连表正反操作技巧
2021/06/13 Python