leet150. 逆波蘭表示式求值
阿新 • • 發佈:2018-11-10
題目:
求在 逆波蘭表示法 中算術表示式的值。
有效的運算子號包括 +
, -
, *
, /
。每個運算物件可以是整數,也可以是另一個逆波蘭計數表達。
例如:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
分析:
- 建立運算子號集合
- 遍歷字串,遇到數字字元,轉換為整數壓入棧中,遇到運算子,彈出棧中最近壓入的數字,運算後將結果壓入棧中
- 遍歷結束棧中元素即為計算結果
程式碼:
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]
思考:
- 此題目的測試算例未考慮兩整數相除,結果為負時,不同語言對結果取整的差異
- 以上演算法中除法運算為為了適應測試算例,商為負數時,採取了小數去尾取整