from stack import Stack#导入栈
import string
def infixToPostfix(infixexpr):
prec = {}#设定优先级
prec["*"]=3
prec["/"]=3
prec["+"]=2
prec["-"]=2
prec["("]=1
opStack = Stack()
postfixlist = []#要输出的结果列表
tokenList = infixexpr.split()#Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
#str.split(str="", num=string.count(str)).,返回分割后的字符串列表
for token in tokenList:
if token in string.ascii_uppercase:
postfixlist.append(token)#如果是操作数,则把它放到结果列表的最后
elif token == '(':
opStack.push(token)#如果是左括号,则将其压入栈中
elif token == ')':
topToken = opStack.pop()#如果出现右括号,从栈中不断弹出元素(弹出一次然后进入while条件循环,把栈中取出的每一个运算符都
while topToken != '(':#添加到结果列表的末尾并且将其弹出。PS.由于第一次的弹出操作还没有将运算符添加到结果列表的末尾,因此我们先调用了
postfixlist.append(topToken)#append()
topToken = opStack.pop()
else:#从栈中找到优先级比当前标记的运算符更高的运算符,把这个更高级的运算符添加到结果列表的末尾,然后把标记的运算符压入栈中
while(not opStack.isEmpty()) and (prec[opStack.peek()]>=prec[token]):
postfixlist.append((opStack.pop()))
opStack.push(token)
while not opStack.isEmpty():#将残留的运算符全部添加到列表的末尾
postfixlist.append(opStack.pop())
return" ".join(postfixlist)