1. 程式人生 > >leet150. 逆波蘭表示式求值

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. 以上演算法中除法運算為為了適應測試算例,商為負數時,採取了小數去尾取整