《Python数据结构和算法分析》第三弹——中序到后续转换

(1) 创建用于保存运算符的空栈opstack,以及一个用于保存结果的空列表。

(2) 使用字符串方法split将输入的中序表达式转换成一个列表。

(3) 从左往右扫描这个标记列表。

  ❏ 如果标记是操作数,将其添加到结果列表的末尾。

  ❏ 如果标记是左括号,将其压入opstack栈中。

  ❏ 如果标记是右括号,反复从opstack栈中移除元素,直到移除对应的左括号。将从栈中取出的每一个运算符都添加到结果列表的末尾。

  ❏ 如果标记是运算符,将其压入opstack栈中。但是,在这之前,需要先从栈中取出优先级更高或相同的运算符,并将它们添加到结果列表的末尾。

(4) 当处理完输入表达式以后,检查opstack。将其中所有残留的运算符全部添加到结果列表的末尾。

from pythonds.basic 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)
 
A = "( A + B ) * ( C + D )"
B = "( A + B ) * C"
C = "A + B * C"

print(infixToPostfix(A))
print(infixToPostfix(B))
print(infixToPostfix(C))

 

posted @ 2025-09-18 17:01  世事洞明皆学问  阅读(4)  评论(0)    收藏  举报