逆波兰式,也叫后缀表达式

技巧:为简化代码,引入一个不存在的运算符#,优先级最低。置于堆栈底部

class Stack(object):
'''堆栈'''
def __init__(self):
self._stack = [] def pop(self):
return self._stack.pop() def push(self, x):
self._stack.append(x)

一、表达式无括号

def solve(bds):
'''不带括号,引入#运算符'''
pro = dict(zip('^*/+-#', [3,2,2,1,1,0]))
out = []
s = Stack()
s.push('#')
for x in bds:
if x in '^*/+-':
t = s.pop()
while pro[x] <= pro[t]:
out.append(t)
t = s.pop() s.push(t)
s.push(x)
else:
out.append(x) while not s.is_null():
out.append(s.pop()) return out[:-1]
bds1 = 'a+b/c^d-e'          # abcd^/+e-
print(bds1, ''.join(solve(bds1)))

二、表达式有括号

def solve(bds):
'''带括号,引入#运算符'''
pro = dict(zip('^*/+-#', [3,2,2,1,1,0]))
out = []
s = Stack()
s.push('#')
for x in bds:
if x == '(': # ①左括号 -- 直接入栈
s.push(x)
elif x == ')': # ②右括号 -- 输出栈顶,直至左括号(舍弃)
t = s.pop()
while t != '(':
out.append(t)
t = s.pop()
elif x in '^*/+-': # ③运算符 -- 从栈顶开始,优先级不小于x的都依次弹出;然后x入栈
while True:
t = s.pop()
if t == '(': # 左括号入栈前优先级最高,而入栈后优先级最低!
s.push(t)
break
if pro[x] <= pro[t]:
out.append(t)
else:
s.push(t)
break
s.push(x)
else: # ④运算数 -- 直接输出
out.append(x) while not s.is_null():
out.append(s.pop()) return out[:-1] bds1 = 'a+b/c^d-e' # abcd^/+e-
bds2 = '(a+b)*c-(d+e)/f' # ab+c*de+f/- print(bds1, ''.join(solve(bds1)))
print(bds2, ''.join(solve(bds2)))

三、根据后缀表达式求值

def solve5(bds):
'''根据后缀表达式求值'''
jishuan = {
'^': lambda x,y: x**y,
'*': lambda x,y: x*y,
'/': lambda x,y: x/y,
'+': lambda x,y: x+y,
'-': lambda x,y: x-y
}
s = Stack()
for x in bds:
if x in '^*/+-':
num2, num1 = s.pop(), s.pop()
r = jishuan[x](float(num1), float(num2))
s.push(r)
else:
s.push(x) return s.pop() bds1 = '2+9/3^2-5' # 2932^/+5- -2
bds2 = '(1+2)*3-(4+5)/6' # ab+c*de+f/- 7.5 print(bds1, '=', solve5(solve(bds1)))
print(bds2, '=', solve5(solve(bds2))) #print(bds1, '=', eval(bds1))
print(bds2, '=', eval(bds2))

python 逆波兰式的更多相关文章

  1. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

  2. Haskell解决逆波兰式

    摘自<Haskell趣学指南- Learn You a Haskell for Great Good> {- 逆波兰式(revese polish notation, RPN): 操作符出 ...

  3. [LeetCode]Evaluate Reverse Polish Notation(逆波兰式的计算)

    原题链接:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ 题目描述: Evaluate the value of a ...

  4. HDU1237 简单的计算器 【堆】+【逆波兰式】

    简单的计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. c# 逆波兰式实现计算器

    语文不好,不太会组织语言,希望不要太在意. 如题,先简要介绍一下什么是逆波兰式  通常我们在写数学公式的时候  就是a+b+c这样,这种表达式称为中缀表达式,逆波兰式又称为后缀表达式,例如a+b 后缀 ...

  6. codechef Transform the Expression 转换成逆波兰式

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  7. NYOJ 35 表达式求值(逆波兰式求值)

    http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...

  8. Evaluate Reverse Polish Notation(逆波兰式)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  9. HDU1237 简单计算器 【栈】+【逆波兰式】

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

随机推荐

  1. BZOJ1259:[CQOI2007]矩形rect(DFS)

    Description 给一个a*b矩形,由a*b个单位正方形组成.你需要沿着网格线把它分成分空的两部分,每部分所有格子连通,且至少有一个格子在原矩形的边界上.“连通”是指任两个格子都可以通过水平或者 ...

  2. 【转】CopyOnWriteArrayList

    初识CopyOnWriteArrayList 第一次见到CopyOnWriteArrayList,是在研究JDBC的时候,每一个数据库的Driver都是维护在一个CopyOnWriteArrayLis ...

  3. Quick setup

    Quick setup — if you’ve done this kind of thing before We recommend every repository include a READM ...

  4. docker启动容器关于防火墙报错

    在重启docker工程时候出错: [root@hadoop-alone ~]# docker start padError response from daemon: driver failed pr ...

  5. 面试 : C语言 功底 被 鄙视了

    第一道:被鄙视 的 C语言语法问题 请看 下面 程序 : 错误程序: void GetMemory( char *p ){ p = (char *) malloc( 100 );}void Test( ...

  6. JAVA类加载和初始化

    JAVA类的加载和初始化 一.类的加载和初始化过程 JVM将类的加载分为3个步骤: 1.加载(Load):class文件创建Class对象. 2.链接(Link) 3.初始化(Initialize) ...

  7. Linux-- 目录基本操作(2)

    cp 复制文件或目录 用法:cp [OPTION] SOURCE源文件 DIRECTORY目标文件,具体可以查看 man cp 以常用的参数举例 [root@hs-192-168-33-206 tom ...

  8. [Oracle]Oracle良性SQL建议

    (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处 ...

  9. SQL分页过多时, 如何优化

    问题: 我们经常会使用到分页操作,这里有个问题,在偏移量非常大的时候,它会导致MySQL扫描大量不需要的行然后再抛弃掉.如: , ; 上述这条SQL语句需要查询10020条记录然后只返回最后20条.前 ...

  10. 二进制mysql安装相关知识

    建议安装5.x版本 高版本没安装经验的慎用 1.1 关闭防火墙systemctl stop firewalld.service #停止firewall#慎用 systemctl disable fir ...