leetcode_227. 基本計算器 II
阿新 • • 發佈:2020-12-07
實現一個基本的計算器來計算一個簡單的字串表示式的值。 字串表示式僅包含非負整數,+, - ,*,/ 四種運算子和空格。 整數除法僅保留整數部分。 示例1: 輸入: "3+2*2" 輸出: 7 示例 2: 輸入: " 3/2 " 輸出: 1 示例 3: 輸入: " 3+5 / 2 " 輸出: 5 說明: 你可以假設所給定的表示式都是有效的。 請不要使用內建的庫函式 eval。 通過次數28,612提交次數74,932 來源:力扣(LeetCode) 連結:https://leetcode-cn.com/problems/basic-calculator-ii 著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
from typing import List class Solution: def calculate(self, s: str) -> int: # 將中綴表示式轉換為字尾表示式 # 遵循以下步驟: # (1) 初始化兩個棧:運算子棧stack和儲存中間結果的棧ls; # (2) 從左至右掃描中綴表示式; # (3) 遇到運算元時,將其壓入ls; # (4) 遇到運算子時,比較其與stack棧頂運算子的優先順序: # (4-1) 如果stack為空,則直接將此運算子入棧; # (4-2) 否則,若優先順序比棧頂運算子的高,也將運算子壓入stack(注意轉換為字首表示式時是優先順序較高或相同,而這裡則不包括相同的情況); # (4-3) 否則,將stack棧頂的運算子彈出並壓入到ls中,再次轉到(4-1)與stack中新的棧頂運算子相比較; # (5) 重複步驟(2)至(4),直到表示式的最右邊; # (7) 將stack中剩餘的運算子依次彈出並壓入ls; # (8) 依次彈出ls # 中的元素並輸出,結果的逆序即為中綴表示式對應的字尾表示式(轉換為字首表示式時不用逆序)。 ls=[] stack=[] def priority(s:str)->int: if s in ['+','-']: return 1 if s in ['*','/']: return 2 num=0 for i ,x in enumerate(s): if x.isdigit(): num=num*10+int(x) if x==' ' and i!=len(s)-1: continue if x in['+','-','*','/']: ls.append(num)#將數字加入ls num=0 if not stack: stack.append(x) elif priority(x)>priority(stack[-1]): stack.append(x) else: while( stack and priority(stack[-1])>=priority(x)): ls.append(stack.pop()) stack.append(x) if i==len(s)-1 and (s[i].isdigit() or s[i]==' '): ls.append(num) while stack: ls.append(stack.pop()) #計算 #t=0 for x in ls: if x not in ['+','-','*','/']: stack.append(x) else: a=stack.pop() b=stack.pop() if x=='+':stack.append(a+b) if x=='-':stack.append(b-a) if x=='*':stack.append(a*b) if x=='/':stack.append(int(b/a)) return stack[0]