中缀表达式转后缀表达式 python

这是之前数据结构学过的知识,现在忘了复习一下,如果有小伙伴对这方面的知识忘了的话我建议看这篇博客,讲的非常详细,我这里主要讲一下用代码实现的思路:
初始一个存放结果的列表:result和存放操作符的栈op_stack
从前往后遍历中缀表达式,处理一下四种情况:

  1. 为数字:则直接添加到result后面
  2. 为(:将其加入到操作符栈里面
  3. 为):在op_stack中向前遍历将(之后的操作符添加到result里面
  4. 为操作符:将op_stack中操作优先级大于等于当前操作符的操作符出栈将其添加到result后面
    对于后缀表达式求值,就简单的多了,就从前往后遍历,遇到数字就进栈,遇到操作符就将栈顶的两个数出栈,运算之后将结果再进栈,遍历结束最后剩下的数字就是这个表达式的结果。
    下面是我的代码:
def infixtopostfix(expression):
   result=[] #用于存放结果的列表
   op_stack=[] #用于存放操作符的栈
   op_priority={'x':2,'/':2,'+':1,'-':1,'(':0,')':0}#操作符优先性字典
   for i in expression:
       if i.isdigit():
           result.append(i)
       elif i=="(":
           op_stack.append(i)
       elif i==")":
           t=op_stack.pop()
           while t!="(":
               result.append(t)
               t=op_stack.pop()
       else:
           while len(op_stack) !=0 and op_priority[op_stack[len(op_stack)-1]] >= op_priority[i]:
               result.append(op_stack.pop())
           op_stack.append(i)
   while len(op_stack) !=0:
       result.append(op_stack.pop())
   return result
print(infixtopostfix("1+2x3-(4-5)"))
def calpostfix(expression):
   res_stack=[]
   for i in expression:
       if i.isdigit():
           res_stack.append(int(i))
       else:
           if i=="+":
               t1=res_stack.pop()
               t2=res_stack.pop()
               res_stack.append(t1+t2)
           elif i=="x":
               t1=res_stack.pop()
               t2=res_stack.pop()
               res_stack.append(t1*t2)
           elif i=="/":
               t1=res_stack.pop()
               t2=res_stack.pop()
               res_stack.append(t2/t1)
           else:
               t1=res_stack.pop()
               t2=res_stack.pop()
               res_stack.append(t2-t1)
   return res_stack[0]
print(calpostfix(infixtopostfix("1+2x3-(4-5)")))

运行结果为:

['1', '2', '3', 'x', '+', '4', '5', '-', '-']
8
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐