关键点在于,我们借助两个栈,一个栈存放操作数,一个栈存放运算符。每次计算都是从运算符栈弹出一个运算符,从操作数栈弹出两个操作数,计算后的结果压回操作数栈。
输入以空格隔开。
def get_value(operator, num1, num2):
'''实现两个数的四则运算'''
if operator == '+':
return num1 + num2
elif operator == '-':
return num1 - num2
elif operator == '*':
return num1 * num2
elif operator == '/':
return num1 / num2
def infix_evaluator(infix_expression: str) -> int:
""" 中缀表达式函数求值 """
token_list = infix_expression.split()
operator_priority = {'*': 3, '/': 3, '+': 2, '-': 2, '(': 1}
digital_stack = []
operator_stack = []
for token in token_list:
if token.isdecimal() or token[1:].isdecimal():
# 正数、负数都入栈
digital_stack.append(int(token))
elif token == '(':
operator_stack.append(token)
elif token == ')':
# 碰到右括号,把栈顶左括号上面的运算符都出栈
top = operator_stack.pop()
while top != '(':
op1 = digital_stack.pop()
op2 = digital_stack.pop() # 弹出两个数用于计算
tmp_ans = get_value(top, op1, op2)
digital_stack.append(tmp_ans)
top = operator_stack.pop() # 弹出下一个栈顶运算符
elif token in '+-*/':
# 比较当前运算符token与opeartor_stack栈顶中运算符的优先级
# 如果栈顶优先级相等或较高,则可以执行两数运算
while operator_stack and operator_priority[operator_stack[-1]] >= operator_priority[token]:
top = operator_stack.pop()
op2 = digital_stack.pop()
op1 = digital_stack.pop()
tmp_ans = get_value(top, op1, op2)
digital_stack.append(tmp_ans)
operator_stack.append(token)
# 表达式遍历完,栈里剩下的操作符也要求值
while operator_stack:
top = operator_stack.pop()
op2 = digital_stack.pop()
op1 = digital_stack.pop()
digital_stack.append(get_value(top, op1, op2))
return digital_stack[0]
if __name__ == '__main__':
s = input()
print(infix_evaluator(s))