leetcode 基礎計算器(中等)

2021-10-21 18:18:00 字數 2394 閱讀 1878

總結基礎運算器,沒有括號,只有加減乘除,運算數字不一定是只有一位的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...