python 栈实现中缀表达式转后缀表达式
作者:互联网
文章目录
题目
把中缀表达式转为后缀表达式,如:
(A+B)∗C−(D−E)∗(F+G)
转为
AB+C∗DE−FG+∗−
思路
-
创建一个字典,
prec
,用来保存运算符的优先级
创建一个空栈,opStack
,用来保存运算符
创建一个空列表,postfixList
,用来保存后缀表达式的每个字符 -
把原始的中缀表达式
infixexpr
,由字符串转为列表tokenList
-
从左到右扫描这个列表
tokenList
中的每一个token
1. 如果token
是一个操作数,如A、B、1、2
等,就添加到postfixList
的末尾
2. 如果token
是一个左括号(
,就压入栈opStack
3. 如果token
是一个右括号)
,就弹出栈顶元素,直到对应的左括号被弹出。并把栈顶弹出的运算符加到postfixList
的末尾
4. 如果token
是一个操作符,*, /, +, -,
等,就把它压入栈opStack
。不过,在这之前要移除opStack
中已有的,并且比token
有更高级别的操作符,同时把这些更高级别的操作符加到postfixList
的末尾 -
当原始的中缀表达式被处理完毕,检查
opStack
。如果不为空的话,依次弹出栈顶元素,并添加到postfixList
的末尾
# 中缀表达式转为后缀表达式
def infixToPostfix(infixexpr):
prec = {} # 定义一个字典,保存优先级
prec["*"] = 3
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
prec["("] = 1
opStack = Stack() # 栈是用来存括号和运算符的
postfixList = [] # 保存要输出的后缀表达式
tokenList = infixexpr.split() # 把中缀表达式转换成列表
for token in tokenList:
if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":
postfixList.append(token)
elif token == '(': # 如果是左括号,就压入栈
opStack.push(token)
elif token == ')': # 遇到右括号,循环判断栈顶元素是否为(,如果不是(,就都加到后缀列表中
topToken = opStack.pop()
while topToken != '(':
postfixList.append(topToken)
topToken = opStack.pop()
print(opStack.isEmpty()) # True False False
else: # 如果是运算符,当栈不为空并且栈顶元素的等级比token的等级高时,栈顶元素加入到后缀列表中
while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]):
postfixList.append(opStack.pop())
opStack.push(token) # 把token压入栈
while not opStack.isEmpty(): # 当opStack中不为空时,依次弹出栈中的元素,加到后缀列表后面
postfixList.append(opStack.pop())
return ''.join(postfixList)
print(infixToPostfix("A * B + C * D"))
print(infixToPostfix("( A + B ) * C - ( D - E ) * ( F + G )"))
AB*CD*+
AB+C*DE-FG+*-
原始中缀表达式 “( A + B ) * C - ( D - E ) * ( F + G )”
参考:
https://runestone.academy/runestone/static/pythonds/BasicDS/InfixPrefixandPostfixExpressions.html
python实现栈Stack
标签:opStack,中缀,python,prec,token,postfixList,表达式 来源: https://blog.csdn.net/m0_37586991/article/details/91442953