1. 什么是后缀表达式
后缀表达式(也叫做逆波兰式或逆波兰记法),其实就是将运算符写在操作数之后的式子。比如我们平时写a+b
,这是中缀表达式,写成后缀表达式就是ab+
。下面来看一个更复杂的例子:
求(a+b)*c-(a+b)/e
后缀表达式的j具体过程:
(a+b)*c-(a+b)/e
→ ((a+b)*c)((a+b)/e)-
→ ((a+b)c*)((a+b)e/)-
→ (ab+c*)(ab+e/)-
→ ab+c*ab+e/-
2. 生成后缀表达式
生成后缀表达式主要借助了**栈
这一数据结构,具体的实现代码如下,其中输入的是中缀表达式的字符串,然后返回后缀表达式**的字符串。
def generate_postfix(infix):
"""
generate postfix expression str
:param infix: infix expression str, like '2x3+8/3'
:return: postfix expression str, like '23x83/+'
"""
op_rank = {'x': 2, '/': 2, '+': 1, '-': 1} # 定义加减乘除的优先级
stack = [] # 用list模拟栈的后进先出
post_list = []
for s in infix:
if s in '+-x/': # operator
# 栈不为空,且栈顶运算符的优先级高于当前运算符
while stack and op_rank.get(stack[-1]) >= op_rank.get(s): # priority
post_list.append(stack.pop())
stack.append(s)
else: # operand
post_list.append(s)
while stack:
post_list.append(stack.pop())
return ''.join(post_list)
3. 计算后缀表达式
后缀表达式的计算同样需要使用到**栈
,具体的实现代码如下,其中输入的是后缀表达式字符串,然后返回该表达式int类型的计算结果**。
def calculate_postfix(postfix):
"""
calculate postfix expression
:param postfix: postfix expression str, like '23x83/+'
:return: int result, like 2x3+8/3=6+2=8
"""
stack = [] # 用list模拟栈的后进先出
for p in postfix:
if p in '+-x/': # operator
value_2 = int(stack.pop()) # 第二个操作数
value_1 = int(stack.pop()) # 第一个操作数
if p == '+':
result = value_1 + value_2
elif p == '-':
result = value_1 - value_2
elif p == 'x':
result = value_1 * value_2
else: # 整除
result = value_1 // value_2
stack.append(result)
else:
stack.append(p)
return stack.pop()