每日一題 棧系列 1 基本計算器

2021-10-21 20:11:48 字數 1491 閱讀 7599

給你乙個字串表示式 s ,請你實現乙個基本計算器來計算並返回它的值。

示例 1:

輸入:s =

"1 + 1"

輸出:2

示例 2:

輸入:s =

" 2-1 + 2 "

輸出:3

示例 3:

輸入:s =

"(1+(4+5+2)-3)+(6+8)"

輸出:23

1<= s.length <=3*

105s 由數字、'+'、'-'、'('、')'、和 ' ' 組成

s 表示乙個有效的表示式

總體思路:字串中一共包含6種字元:。在數學中,我們進行帶括號的加減運算有兩種方法:

先計算括號內,在計算括號外,從左往右依次計算

首先去掉所有的括號,且去括號後要變號,然後從左往右依次計算。

相比較而言,第二種方法更直接。我們選擇第二種方法來實現。

如果要展開表示式中所有的括號,則得到的新表示式中,數字本身不會發生變化,只是每個數字前面的符號會發生變化。

因此,我們考慮使用乙個取值為 的整數 sign 代表「當前」的符號。根據括號表示式的性質,它的取值:

考慮到第二點,我們需要維護乙個棧 stk,其中棧頂元素記錄了當前位置所處的每個括號所「共同形成」的符號。因此,數字加減的符號實際由兩部分決定:

數字本身前面的+、-符號。這一部分,通過判斷 『+』 後者 『-』 ,可直接給sign取正或者負

數字外的一系列括號。這一部分,根一系列括號有關。如果括號前是+,則括號內部不需要變號,如果是負,則需要變號。因此括號前的符號特別重要,且括號是由作用範圍的,以正括號開始,反括號結束,所以需要用棧stk來儲存符號,且棧頂stk.top()表示的是當前的符號。

c++實現如下:

class

solution

else

if(s[i]

=='+'

)else

if(s[i]

=='-'

)else

if(s[i]

=='('

)else

if(s[i]

==')'

)else

ans +

= sign * num;}}

return ans;}}

;

測試結果:

複雜度分析:

由於水平有限,部落格中難免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!

推薦文章

LeetCode 224 基本計算器 每日一題

224.基本計算器 實現乙個基本的計算器來計算乙個簡單的字串表示式s的值。先附上乙個大佬的做法,兩個棧乙個記錄數字,乙個記錄左括號前面的符號f,這樣當遇到右括號的時候直接將棧頂的值加上f 括號內的值,很簡便的做法 class solution ans sign num else if str i e...

每日一題 小計算器(模擬)

資源限制 時間限制 1.0s 記憶體限制 256.0mb daily english 當乙個好人受到傷害,所有的好人定將與其同歷磨難。when a good man is hurt,all who would be called good must suffer with him.模擬程式型計算器,...

每日一題 1

題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...