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) 來獲得相關源碼。