轻松转化前后缀表达式
做题时碰到有关后缀表达式的问题,觉得这方法还挺易懂的,在这边记录一下
这里以后缀表达式为例:X=A+B*(C-D)/E+F
-
将表达式中的运算按优先级加上括号
-
将每个括号里的运算符提取到对应括号后面
-
删除括号,得到的就是后缀表达式啦
-
如果求前缀表达式,第二步里改为提取到括号前面即可
代码示例
# 求后缀表达式
def getPostfix(str):
# 运算符和对应的优先级
priority = {'=':0, '(':1, '+':2, '-':2, '*':3, '/':3, ')':4}
# 储存运算符的栈,初始化里可以随便加一个符号,方便避免越界,但注意别把它输出了
stack = ['#']
# 求得的表达式
res = []
for i in str:
# 如果碰到后括号,就出栈至上一个前括号
if i == ')':
while len(stack) > 1 and i != '(':
i = stack.pop()
if i != '(':
res.append(i)
# 直接入栈前括号和等于号
elif i == '(' or i == '=':
stack.append(i)
# 比较当前运算符和栈顶符号的优先级,当前运算符优先级大于栈顶符号时停止出栈。
# 默认值取101和100是为了排除非运算符
elif priority.get(i, 101) <= priority.get(stack[len(stack)-1], 100):
while priority.get(i, 101) <= priority.get(stack[len(stack)-1], 100):
res.append(stack.pop())
stack.append(i)
# 入栈剩余情况下的运算符
elif priority.get(i, -1) > -1:
stack.append(i)
# 非运算符直接存入结果
else:
res.append(i)
# 出栈剩余运算符
while len(stack) > 1:
res.append(stack.pop())
# 输出结果
for i in res:
print(i, end = '')
print('')

浙公网安备 33010602011771号