一. 算法步骤
- 创建用于保存运算符的空栈opstack,以及一个用于保存结果的空列表
- 使用字符串方法split将输入的终须表达式转换成一个列表
- 从左往右扫描这个标记列表。
- 如果标记是操作数,将其添加到结果列表的末尾。
- 如果标记是左括号,将其压入opstack中。
- 如果标记是有括号,反复从opstack栈中移除元素,直到移除对应的左括号。将从栈中取出的每一个运算符都添加到结果列表的末尾。
- 如果标记是运算符,将其压入opstack栈中。但是,在此之前,需要先从栈中取出优先级更高或相同的运算符,并将它们添加到结果列表的末尾。
- 当处理完输入表达式后,检查opstack。将其中所有残留的运算符全部添加到结果列表的末尾。
示意图如下
二、Python代码实现
from ch03.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()
for token in tokenList:
if token in string.ascii_uppercase:
postfixList.append(token)
elif token == '(':
opStack.push(token)
elif token == ')':
topToken = opStack.pop()
while topToken != '(':
postfixList.append(topToken)
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)
Stack.py代码如下
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
三、测试代码
def main():
str = input()
print(infixToPostfix(str))
if __name__== "__main__":
main()