leet150. 逆波兰表达式求值

题目:

求在 逆波兰表示法 中算术表达式的值。

有效的运算符号包括 +-*/ 。每个运算对象可以是整数,也可以是另一个逆波兰计数表达。

例如:

  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

分析:

  1. 建立运算符号集合
  2. 遍历字符串,遇到数字字符,转换为整数压入栈中,遇到运算符,弹出栈中最近压入的数字,运算后将结果压入栈中
  3. 遍历结束栈中元素即为计算结果

代码:

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        def op(char,a,b):
            if char == '+':
                return a + b
            elif char == '-':
                return a - b
            elif char == '*':
                return a * b
            else:
                if a:
                    sign = (a * b) / abs(a * b)
                else:
                    sign = 1
                return sign * (abs(a) / abs(b))
        opSet = set('+-*/')
        numStack = []
        for x in tokens:
            if x in opSet:
                # print x
                op2 = numStack.pop()
                op1 = numStack.pop()
                numStack.append(op(x,op1,op2))
            else:
                numStack.append(int(x))
            # print numStack
        return numStack[-1]

思考:

  1. 此题目的测试算例未考虑两整数相除,结果为负时,不同语言对结果取整的差异
  2. 以上算法中除法运算为为了适应测试算例,商为负数时,采取了小数去尾取整



猜你喜欢

转载自blog.csdn.net/yzp1011/article/details/79766250