給你乙個字串表示式 s ,請你實現乙個基本計算器來計算並返回它的值。 整數除法僅保留整數部分。
示例1:s=" 3 +2*2" ->7
示例2:s=" 3/2 "->1
示例3:s=:" 3+5 / 2"->5
規則:1、1 <= s.length <= 3 * 105
2、s 由整數和算符 (』+』, 『-』, 『*』, 『/』) 組成,中間由一些空格隔開
3、s 表示乙個 有效表示式
4、表示式中的所有整數都是非負整數,且在範圍 [0, 231 - 1] 內
5、題目資料保證答案是乙個 32-bit 整數
測試用例可用"3+2*2"; "5/2"; " 3 + 8* 8 "
基本思路:棧
由於在算術中,/的優先順序比-+高,所以我們可以先進行所有的/運算,然後將結果放在表示式原位置,最後表示式的值就為所有數加減後的值;
方法:我們可以用乙個棧,儲存進行*/運算後的值,對於-+運算子之後的數字,直接壓入棧,對於*/之後的數字,與當前棧頂元素進行計算後,替換當前棧頂元素;
**實現:
首先函式接收到字串s之後,先呼叫s.trim();
方法,刪除字串前後的空字元;
var pre="+"
將字串第乙個數字前視為加號,遍歷字串,遇到字元符合(數字&&不是空字元)的話,識別當前的數字,遇到字元符合(不是數字||遍歷到字串最後乙個字元)視為遍歷到了數字末尾或者字串末尾,根據pre來決定計算方式,運算之後將pre更新為當前的字元
pre:
1."+", num入棧
2."-", (-num)入棧
3."* /" 計算數字與棧頂元素,並且替換棧頂元素為計算結果
遍歷完字串s後,將棧中的元素進行累加,得出最終值。
varcalculate
=function
(s)if
(isnan
(number
(s[i]))
|| i===s.length-1)
//執行這個if說明乙個數字已經遍歷結束
case
"-":
case
"*":
case
"/":
} pre=s[i]
; num=0;
}}var sum=0;
while
(stack.length)
return sum;};
console.
log(
calculate
(" 3 +2*2"))
;//測試用例
<
/script>
Leetcode 每日一練
最小棧 設計乙個支援 push pop top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。示例 輸入 minstack push push push getmin pop top ge...
Leetcode 每日一練
leetcode 每日一練 擁有最多糖果的孩子 給你乙個陣列 candies 和乙個整數 extracandies 其中 candies i 代表第 i 個孩子擁有的糖果數目。對每乙個孩子,檢查是否存在一種方案,將額外的 extracandies 個糖果分配給孩子們之後,此孩子有 最多 的糖果。注意...
Leetcode 每日一練
猜數字 小a 和 小b 在玩猜數字。小b 每次從 1,2,3 中隨機選擇乙個,小a 每次也從 1,2,3 中選擇乙個猜。他們一共進行三次這個遊戲,請返回 小a 猜對了幾次?輸入的guess陣列為 小a 每次的猜測,answer陣列為 小b 每次的選擇。guess和answer的長度都等於3。示例 1...