将中序表达式转换成后序表达式

一. 算法步骤

  1. 创建用于保存运算符的空栈opstack,以及一个用于保存结果的空列表
  2. 使用字符串方法split将输入的终须表达式转换成一个列表
  3. 从左往右扫描这个标记列表。
    • 如果标记是操作数,将其添加到结果列表的末尾。
    • 如果标记是左括号,将其压入opstack中。
    • 如果标记是有括号,反复从opstack栈中移除元素,直到移除对应的左括号。将从栈中取出的每一个运算符都添加到结果列表的末尾。
    • 如果标记是运算符,将其压入opstack栈中。但是,在此之前,需要先从栈中取出优先级更高或相同的运算符,并将它们添加到结果列表的末尾。
  4. 当处理完输入表达式后,检查opstack。将其中所有残留的运算符全部添加到结果列表的末尾。
    示意图如下
    image.png

二、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()

四、输入输出结果

图片.png

你可能感兴趣的:(将中序表达式转换成后序表达式)