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计算回文数的方法
Mar 11 Python
Python中的if、else、elif语句用法简明讲解
Mar 11 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
使用tensorflow实现线性回归
Sep 08 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
Jun 11 Python
python实现动态创建类的方法分析
Jun 25 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
python识别验证码图片实例详解
Feb 17 Python
Python 创建TCP服务器的方法
Jul 28 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
PHP 数据库树的遍历方法
2009/02/06 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
初步解析Python中的yield函数的用法
2015/04/03 Python
python如何查看系统网络流量的信息
2016/09/12 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
python调用百度REST API实现语音识别
2018/08/30 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
Python对象的属性访问过程详解
2020/03/05 Python
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
金蝶的一道SQL笔试题
2012/12/18 面试题
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
生物科学专业个人求职信范文
2013/12/07 职场文书
转正申请报告格式
2015/05/15 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android