python【栈】中缀表达式转后缀表达式

文章目录

题目

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

思路

  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

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值