"""
中序表达式转为后序表达式:(假设中序表达式是一个以空格分隔的标记字符串)
①创建用于保存运算符的空栈opstack,以及一个用于保存结果的空列表
②使用字符串split方法将输入的中序表达式转换成一个列表
③从左到右扫描这个标记列表
如果标记是操作数,将其添加到结果列表的末尾;
如果标记是左括号,将其压入栈中;
如果标记是右括号,反复从opstack中弹出元素,直到弹出对应的左括号。将栈中取出的么一个运算符都添加到结果列表的末尾;
如果标记是运算符,将其压入opstack中,但是在此之前先从栈中取出优先级更高或者相同的运算符,并将它们添加到结果列表的末尾;
④处理完表达式之后,检查opstack。将其中若剩下的运算符全部添加到结果列表的末尾,最后调用join方法连接形成后序表达式
"""
from Algorithm import Stack_1
import string
def infixToPostfix(infixexpr):
# 定义字典,将运算符优先级转化为数字,数字越大优先级越大
prec = { }
prec["*"] = 3
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
prec["("] = 1
# 实例化一个空栈,以及一个空列表存放临时结果
opstack = Stack_1.Stack()
postfixList = []
# 字符串方法,将前序表达式转换为列表
tokenList = infixexpr.split()
#遍历前序表达式列表
for token in tokenList:
#如果标记是操作数,将其添加到结果列表的末尾;
if token in string.ascii_uppercase:
postfixList.append(token)
#如果标记是左括号,将其压入栈中;
elif token == "(":
opstack.push(token)
#如果标记是右括号,反复从opstack中弹出元素,直到弹出对应的左括号。将栈中取出的么一个运算符都添加到结果列表的末尾;
elif token ==")":
topToken = opstack.pop()
while topToken !="(":
postfixList.append(topToken)
topToken = opstack.pop()
else:
#如果标记是运算符,将其压入opstack中,但是在此之前先从栈中取出优先级更高或者相同的运算符,并将它们添加到结果列表的末尾;
while (not opstack.isEmpty()) and (prec[opstack.peek()]>=prec[token]):
postfixList.append(opstack.pop())
opstack.push(token)
#遍历结束后,处理完表达式之后,检查opstack。将其中若剩下的运算符全部添加到结果列表的末尾
while not opstack.isEmpty():
postfixList.append(opstack.pop())
return " ".join(postfixList)
if __name__ == "__main__":
print(infixToPostfix("( A + B ) * ( C + D )"))
Python利用栈实现中序表达式转换后序表达式
最新推荐文章于 2024-07-04 16:04:39 发布