计算后序表达式

本文记录将中序表达式转换为后序表达式后,对后序表达式求值的算法

一、算法概览

扫描后序表达式时,利用保存操作数,当遇到一个操作符时,从栈里弹出两个数进行计算。
注意事项:
后序表达式只改变运算符的位置,因此操作数的位置与在中序表达式中的位置一样。所以遇到操作符"+"、"*"时可以不考虑弹出元素的顺序,但是如果是"-"或"/"时,必须注意弹出数的操作顺序。

二、示例

后序表达式7 8 + 3 2 + /求解过程如下:


计算后序表达式_第1张图片
stack.png

三、程序描述

假定后序表达式是一个以空格分隔的标记串。其中,运算符标记有+ - * /,操作数是一位的整数值。
程序算法步骤:

  1. 创建空栈operandStack
  2. 使用字符串方法split将输入的后序表达式转换成一个列表
  3. 从左往右扫描这个标记列表
    • 如果标记是操作数,将其转换成整数并压入operandStack栈中
    • 如果标记是运算符,从operandStack中弹出两个操作数。第一次取出右操作数,第二次取出左操作数。进行相应的算术运算,然后将运算结果压入operandStack栈中
  4. 当处理完输入表达式时,栈中的值就是结果。将其从栈中返回
# encoding: utf-8
# @Author   : sxg
# @FILE     : postfixEval.py
# @Time     : 2019/10/28 上午1:14
# @Software : PyCharm

from ch03.Stack import Stack

def postfixEval(postfixExpr):
    operandStack = Stack()

    tokenList = postfixExpr.split();

    for token in tokenList:
        if token in "0123456789":
            operandStack.push(int(token))
        else:
            operand2 = operandStack.pop()
            operand1 = operandStack.pop()
            result = doMath(token, operand1, operand2)
            operandStack.push(result)
    return operandStack.pop()


def doMath(op, op1, op2):
    if op == "*":
        return op1 * op2
    elif op == "/":
        return op1 / op2
    elif op == "+":
        return op1 + op2
    else:
        return op1 - op2


def main():
    str = input()
    print(postfixEval(str))


if __name__ == "__main__":
    main()

四、测试结果

图片.png

你可能感兴趣的:(计算后序表达式)