LeetCode Evaluate Reverse Polish Notation

LeetCode解題之Evaluate Reverse Polish Notation


原題

對表達式的後綴形式(也稱爲逆波蘭表達式)進行計算並返回結果。操作符只有加減乘除四種,操作數爲一個整數或者一個表達式。

注意點:

例子:

輸入: tokens = [“2”, “1”, “+”, “3”, “*”]

輸出: 9

解題思路

後綴表達式的形式爲操作數1,操作數2,操作符,也就是操作符要進行計算操作的兩個數(或者表達式)在它的前方,所以在遍歷列表的時候,我們要將前面的操作符壓入棧中,當遇到操作符的時候,我們將它對應的操作數彈出並進行計算,計算結果可能是其他操作符的操作數,它原來是一個表達式,我們將該表達式的值計算出來了,所以應該把那個值繼續壓棧,遍歷完整個列表的時候,計算結束。這裏特別要注意的是除法操作,因爲給的表達式都是合法的,所以不用考慮除數爲零的情況,但這裏的除法操作是針對整數的,會對結果進行去尾操作。對負數與整數的除法操作也與Python自帶的計算方式不同,Python計算-1//2結果爲-1,而在這裏應該爲0,所以要進行特殊的處理。

AC源碼

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        stack = []
        for token in tokens:
            if token not in ("+", "-", "*", "/"):
                stack.append(int(token))
            else:
                second = stack.pop()
                first = stack.pop()
                if token == "+":
                    stack.append(first + second)
                elif token == "-":
                    stack.append(first - second)
                elif token == '*':
                    stack.append(first * second)
                else:
                    if first * second < 0:
                        stack.append(-(abs(first) // abs(second)))
                    else:
                        stack.append(first // second)
        return stack.pop()


if __name__ == "__main__":
    assert Solution().evalRPN(["2", "1", "+", "3", "*"]) == 9
    assert Solution().evalRPN(["4", "13", "5", "/", "+"]) == 6
    assert Solution().evalRPN(["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]) == 22

歡迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 來獲得相關源碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章