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中http请求方法库汇总
Jan 06 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
python输入错误密码用户锁定实现方法
Nov 27 Python
python实现kMeans算法
Dec 21 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
tensorflow之读取jpg图像长和宽实例
Jun 18 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
python如何使用腾讯云发送短信
Sep 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
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
介绍一些PHP判断变量的函数
2012/04/24 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
PHP闭包函数详解
2016/02/13 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
AngularJS入门教程中SQL实例详解
2016/07/27 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python 遍历列表提取下标和值的实例
2018/12/25 Python
python实现Virginia无密钥解密
2019/03/20 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
农业局学习党的群众路线教育实践活动心得体会
2014/03/07 职场文书
文明城市标语
2014/06/16 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
2014年商场工作总结
2014/11/22 职场文书
优秀团队申报材料
2014/12/26 职场文书
总经理助理岗位职责
2015/01/31 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
医院感染管理制度
2015/08/05 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
Elasticsearch 聚合查询和排序
2022/04/19 Python
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android