def isOperand(token):
if token in [str(i) for i in range(0, 10)]:
return True
return False
def isOperator(token):
if token in ['+', '-', '*', '/']:
return True
return False
def cal(tokens):
stack = []
for token in tokens:
if isOperand(token):
stack.append(token)
elif isOperator(token):
operand2 = stack.pop()
operand1 = stack.pop()
exp = str(operand1) + str(token) + str(operand2)
result = eval(exp)
stack.append(result)
return stack[0]
def trans(tokens):
priority = {'+': 0, '-': 0, '*': 2, '/': 2, '(': 3}
result = []
operators = []
for token in tokens:
if isOperand(token):
result.append(token)
if token == '(':
operators.append(token)
if isOperator(token):
for operator in operators[::-1]:
if operator == '(':
break
if priority[token] <= priority[operator]:
result.append(operators.pop())
else:
break
operators.append(token)
if token == ')':
for operator in operators[::-1]:
if operator != '(':
result.append(operators.pop())
else:
operators.pop()
break
result.extend(reversed(operators))
return ' '.join(result)
def main():
tokens = input("enter: ")
print(trans(tokens))
if __name__ == '__main__':
main()
计算后缀表达式
cal()函数计算后缀表达式的值。计算一个后缀表达式涉及三个步骤:
1. 从左到右遍历表达式,将运算数加入栈中。
2. 遇到第一个运算符的时候,取出栈中的两个运算数,对它们应用该运算符,将结果放入栈中。
3. 继续遍历,遍历结束时栈中只剩下表达式的值。
中缀表达式转后缀表达式
只要一遇到运算数,就将其加入后缀序列中。遇到运算符时,通常要加入一个栈中。但在加入之前,先将它之前所有具有较高优先级的运算符转移到后缀字符串中。括号特殊处理:读到左括号直接加入栈中,读到右括号持续弹出直到遇到左括号(丢弃左括号)。