轻松转化前后缀表达式

做题时碰到有关后缀表达式的问题,觉得这方法还挺易懂的,在这边记录一下


这里以后缀表达式为例:X=A+B*(C-D)/E+F

  1. 将表达式中的运算按优先级加上括号

    image-20210327212145498
  2. 将每个括号里的运算符提取到对应括号后面

    image-20210327212535893
  3. 删除括号,得到的就是后缀表达式啦

    image-20210327212652891
  4. 如果求前缀表达式,第二步里改为提取到括号前面即可


代码示例

# 求后缀表达式
def getPostfix(str):
    # 运算符和对应的优先级
    priority = {'=':0, '(':1, '+':2, '-':2, '*':3, '/':3, ')':4}
    # 储存运算符的栈,初始化里可以随便加一个符号,方便避免越界,但注意别把它输出了
    stack = ['#']
    # 求得的表达式
    res = []
    for i in str:
        # 如果碰到后括号,就出栈至上一个前括号
        if i == ')':
            while len(stack) > 1 and i != '(':
                i = stack.pop()
                if i != '(':
                    res.append(i)
        # 直接入栈前括号和等于号
        elif i == '(' or i == '=':
            stack.append(i)
        # 比较当前运算符和栈顶符号的优先级,当前运算符优先级大于栈顶符号时停止出栈。
        # 默认值取101和100是为了排除非运算符
        elif priority.get(i, 101) <= priority.get(stack[len(stack)-1], 100): 
            while priority.get(i, 101) <= priority.get(stack[len(stack)-1], 100): 
                res.append(stack.pop())
            stack.append(i)
        # 入栈剩余情况下的运算符
        elif priority.get(i, -1) > -1:
            stack.append(i)
        # 非运算符直接存入结果
        else:
            res.append(i)
    # 出栈剩余运算符
    while len(stack) > 1:
        res.append(stack.pop())
    # 输出结果
    for i in res:
        print(i, end = '')
    print('')
posted @ 2021-03-27 21:31  一语子  阅读(227)  评论(0)    收藏  举报