150. 逆波蘭表示式求值
根據逆波蘭表示法,求表示式的值。
有效的運算子包括+
,-
,*
,/
。每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。
輸入: ["2", "1", "+", "3", "*"]
輸出: 9
解釋: ((2 + 1) * 3) = 9
【資料結構】波蘭式、逆波蘭式與表示式求值
簡單來說,平時我們的運算是中綴表示式,對著應二叉樹的中序遍歷,而逆波蘭表示式對應著二叉樹的後序遍歷,波蘭式對應先序遍歷。
由字首表示式求出結果十分方便,只需要用乙個棧實現:
我們可以用乙個棧s2來實現計算,掃瞄從左往右進行,如果掃瞄到運算元,則壓進s2,如果掃瞄到操作符,則從s2彈出兩個運算元。進行相應的操作,並將結果壓進s2(s2的個數出2個進1個),當掃瞄結束後,s2的棧頂就是表示式結果。字尾表示式和字首表示式看起來就像一對逆過程,實際上並不是這樣子,因為字元讀取的時候都是從左往右的,所以,字首表示式往往需要用兩個棧來計算,其中乙個棧用來預處理:將字串倒序壓進棧中。
class solution:
def evalrpn(self, tokens) :
"""用乙個棧s2來實現計算,掃瞄從左往右進行,如果掃瞄到運算元,則壓進s2,
如果掃瞄到操作符,則從s2彈出兩個運算元。進行相應的操作,並將結果壓進s2(s2的個數出2個進1個),
當掃瞄結束後,s2的棧頂就是表示式結果。
"""stack =
for c in tokens:
if c.isdigit() or ('-' in c and len(c)>1):
else:
# 注意除數與被除數 [0,3,/]
b,a = stack.pop(),stack.pop() # list中彈出最後乙個
if c == '+':
elif c == '-':
elif c == '*':
elif c == '/':
return stack[0]
if __name__ == '__main__':
tokens = ["2", "1", "+", "3", "*"]
a = "-88" # print(a.isdigit()) # false
b = "88" #print(b.isdigit()) # true
print(3/2) # 1.5
print(int(3/2)) # 1
print(solution().evalrpn(tokens))
注意main中的一些區別,和除數與被除數的關係。
str.isdigit()注意是str型別。
leetcode 150:逆波蘭表示式求值(最詳細解決方案!!!)這種感覺也不錯~
class solution:
def evalrpn(self, tokens):
""":type tokens: list[str]
:rtype: int
"""stack = list()
oper = ['+', '-', '*', '/']
for char in tokens:
if char not in oper:
else:
top1 = stack.pop()
top2 = stack.pop()
if char == '+':
elif char == '-':
elif char == '*':
elif char == '/':
return stack.pop()
LeetCode 150 逆波蘭表示式
根據 逆波蘭表示法,求表示式的值。有效的運算子包括 每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。說明 整數除法只保留整數部分。給定逆波蘭表示式總是有效的。換句話說,表示式總會得出有效數值且不存在除數為 0 的情況。示例 1 輸入 2 1 3 輸出 9 解釋 該算式轉化為常見的中綴算術表示式為...
leetcode 150 逆波蘭表示式求值
根據逆波蘭表示法,求表示式的值。有效的運算子包括 每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。說明 示例 1 輸入 2 1 3 輸出 9 解釋 2 1 3 9示例 2 輸入 4 13 5 輸出 6 解釋 4 13 5 6從前往後遍歷陣列,遇到數字則壓入棧中,遇到符號,則把棧頂的兩個數字拿出來...
LeetCode 150 逆波蘭表示式求值
根據逆波蘭表示法,求表示式的值。有效的運算子包括 每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。說明 整數除法只保留整數部分。給定逆波蘭表示式總是有效的。換句話說,表示式總會得出有效數值且不存在除數為 0 的情況。示例 1 輸入 2 1 3 輸出 9 解釋 2 1 3 9 示例 2 輸入 4 ...