總結基礎運算器,沒有括號,只有加減乘除,運算數字不一定是只有一位的0~9,可能是多位。在提交了7遍之後,終於通過了。。。(大哭)
給你乙個字串表示式 s ,請你實現乙個基本計算器來計算並返回它的值。整數除法僅保留整數部分。
示例 1:
輸入:s = 「3+2*2」
輸出:7
示例 2:
輸入:s = " 3/2 "
輸出:1
示例 3:
輸入:s = " 3+5 / 2 "
輸出:5
注:雖然示例給的是個位數,但是題目要求是對於十進位制數都可以的,要考慮如何把字串轉化為數字。
分析:先乘除,後加減。運算符號和數字分別壓棧
乘除:遍歷一遍字串:1、遇到space,直接跳過 2、遇到數字,判斷它到底有幾位,利用ascll將字串轉化為long int 整型(之前用過int 整型,但是在測試**現了溢位現象) 3、遇到加減,符號壓棧 3、遇到*\,將這個符號前後兩個數運算,將計算結果代替原來的top()。
加減:乘除中,我是在字串從前往後這麼遍歷的,這就導致乙個問題,之後進行加減運算的時候,還要把棧中元素的順序reverse。
所以我在想,從後往前,會不會節省記憶體,這樣就不用在reverse棧了。
class solution
else
}else
if(s[i]
==43
)else
if(s[i]
==45
)else
if(s[i]
==42
) temp=temp*help;
num.
push
(temp);}
else
if(s[i]
==47
) temp=temp/help;
num.
push
(temp);}
else
}while
(!symbol.
empty()
)while
(!num.
empty()
)//後加減
while
(!symbol1.
empty()
)else
if(symbol1.
top()==
-1)else
} temp=num1.
top();
return temp;}}
;
由於乘除優先於加減計算,因此不妨考慮先進行所有乘除運算,並將這些乘除運算後的整數值放回原表示式的相應位置,則隨後整個表示式的值,就等於一系列整數加減後的值。
基於此,我們可以用乙個棧,儲存這些(進行乘除運算後的)整數的值。對於加減號後的數字,將其直接壓入棧中;對於乘除號後的數字,可以直接與棧頂元素計算,並替換棧頂元素為計算後的結果。
具體來說,遍歷字串 ss,並用變數 \textitpresign 記錄每個數字之前的運算子,對於第乙個數字,其之前的運算子視為加號。每次遍歷到數字末尾時,根據 \textitpresign 來決定計算方式:
加號:將數字壓入棧;
減號:將數字的相反數壓入棧;
乘除號:計算數字與棧頂元素,並將棧頂元素替換為計算結果。
**實現中,若讀到乙個運算子,或者遍歷到字串末尾,即認為是遍歷到了數字末尾。處理完該數字後,更新 presign 為當前遍歷的字元。
遍歷完字串 s 後,將棧中元素累加,即為該字串表示式的值。
優點:將加減統一為加(減去相反數)。減少記憶體和時間。
class solution if(
!isdigit
(s[i]
)&& s[i]
!=' '
|| i == n -1)
presign = s[i]
; num =0;
}}return
accumulate
(stk.
begin()
, stk.
end(),
0);//另乙個高階函式,計算棧裡面的元素之和}}
之前學習資料結構的時候,在棧的應用那一節,詳細講了如何通過棧進行四則運算,記得還有專門的字尾,字首寫法。現在都已經忘得七七八八了,只記得如果遇到右括號,就一直彈棧,直到彈到第乙個左括號為止。
但是面對千奇百怪的問題變形,記得理論什麼的可能也沒多大用了,一些基本的思想,包括實踐的經驗還有待慢慢積累練習。。。。。。
LeetCode 基本計算器
實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式可以包含左括號 右括號 加號 減號 非負整數和空格 示例 1 輸入 1 1 輸出 2 示例 2 輸入 2 1 2 輸出 3 示例 3 輸入 1 4 5 2 3 6 8 輸出 23 說明 你可以假設所給定的表示式都是有效的。請不要使用內建的...
LeetCode 基本計算器II
實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式僅包含非負整數,四種運算子和空格 整數除法僅保留整數部分。示例 1 輸入 3 2 2 輸出 7 示例 2 輸入 3 2 輸出 1 示例 3 輸入 3 5 2 輸出 5 說明 你可以假設所給定的表示式都是有效的。請不要使用內建的庫函式 ev...
leetcode 基本計算器II
按照兩個棧的思路去匯入數字和數學操作,然後根據先乘除後加減的法則,找到第乙個運算元和第二運算元即可。具體 如下 class solution def calculate self,s str int string for char in s if char string char nums oper...