编程语言
首页 > 编程语言> > python 栈实现中缀表达式转后缀表达式

python 栈实现中缀表达式转后缀表达式

作者:互联网

文章目录

题目

把中缀表达式转为后缀表达式,如:
(A+B)C(DE)(F+G)( A + B ) * C - ( D - E ) * ( F + G )(A+B)∗C−(D−E)∗(F+G)
转为
AB+CDEFG+AB+C*DE-FG+*-AB+C∗DE−FG+∗−

思路

  1. 创建一个字典, prec,用来保存运算符的优先级
    创建一个空栈,opStack,用来保存运算符
    创建一个空列表,postfixList,用来保存后缀表达式的每个字符

  2. 把原始的中缀表达式infixexpr,由字符串转为列表tokenList

  3. 从左到右扫描这个列表tokenList中的每一个token
    1. 如果token是一个操作数,如A、B、1、2等,就添加到postfixList的末尾
    2. 如果token是一个左括号(,就压入栈opStack
    3. 如果token是一个右括号),就弹出栈顶元素,直到对应的左括号被弹出。并把栈顶弹出的运算符加到postfixList的末尾
    4. 如果token是一个操作符, *, /, +, -,等,就把它压入栈 opStack。不过,在这之前要移除opStack中已有的,并且比token有更高级别的操作符,同时把这些更高级别的操作符加到postfixList的末尾

  4. 当原始的中缀表达式被处理完毕,检查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