python计算后续表达式

  列举一个后续表达式:4 5 6  *  +。当从左往右扫描该表达式时,首先会遇到操作数4和5.在遇

下一个符号之前,我们不确定要对它们进行计算。将他们都保存在栈中,变可以在需要是取用。

  在本例中,紧接着出现的符号又是一个操作数。因此,将6也压入栈中,并继续检查后面的符

号。现在遇到运算符*。这意味着需要将最近遇到的两个操作数相乘。通过执行两次出栈操作,可

以得到相应的操作数,然后进行乘法运算,得到结果30。

  接着,将结果压入栈中。这样一来当遇到后面的运算符时,它可以作为操作数。当处理完最

后一个运算符之后,栈中只剩一个值。将这个值取出来,并作为表达式的结果返回。

    

  在列举一个复杂的例子:7 8 + 3 2 + /。有两处需要注意。首先伴随着子表达式的计算,栈增

大、缩小,然后再一次增大。其次,处理除去算法时需要非常小心。由于后续表达式只改变运算

符的位置,因此操作数的位置与在中序表达式中的位置相同。当从栈中去除除号的操作数时,它

们顺序颠倒了。由于除号不是可交换的运算符(15/5和5/15的结果不相同),因此必须保证操作

数的顺序没有颠倒。

    

  假设后续 表达式是一个以空格分隔的标记串,其中,运算符标记有*、/、+、-,操作数标记

的是一位的整数值。结果是一个整数。

  (1)创建空栈operandStack。

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

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

    如果标记是操作数,将其转换成整数并且压入operandStack栈中。

    若果标记是运算符,从operandStack栈中取出晾干操作数。第一次取出右操作数,第二次

取出左操作数。进行相应的算术运算,然后将运算结果压入operandStack栈中。

  (4)当处理完输入表达式时,栈中的值就是结果。将其压入栈中返回。

 1 from pythonds.basic import Stack
 2 def postfixEval(postfixExpr):
 3     operandStack = Stack()
 4 
 5     tokenList = postfixExpr.split()
 6 
 7     for token in tokenList:
 8         if token in "0123456789":
 9             operandStack.push(int(token))
10         else:
11             operand2 = operandStack.pop()
12             operand1 = operandStack.pop()
13             result = doMath(token,operand1,operand2)
14             operandStack.push(result)
15 
16     return operandStack.pop()
17 
18 def doMath(op,op1,op2):
19     if op == "*":
20         return op1 * op2
21     elif op == "/":
22         return op1 / op2
23     elif op == "+":
24         return op1 + op2
25     else:
26         return op1 - op2
原文地址:https://www.cnblogs.com/mtfan01/p/14487623.html