LeetCode 224. Basic Calculator(Hard)#Stack

LeetCode 224 題的問題是實現一個基本計算器,可以處理加法、減法、括號和空格。

範例 1:
輸入: s = "1 + 1"
輸出: 2

範例 2:
輸入: s = " 2-1 + 2 "
輸出: 3

範例 3:
輸入: s = "(1+(4+5+2)-3)+(6+8)"
輸出: 23


這個問題可以通過使用棧(Stack)來處理。
棧是一種先進後出的數據結構,對於處理嵌套結構(比如括號)很有用。
可將遍歷輸入字元串並使用兩個棧:一個棧用於存儲操作數,另一個棧用於存儲操作符。

Step1.初始化變數和Stack。

Step2.遍歷字元串中的每個字元:
如果是數字字元,構建當前操作數。
如果是 '+' 或 '-',更新當前操作符。
如果是 '(',將當前結果和操作符分別入棧,並重置結果和操作符。
如果是 ')',計算括號內的結果,並從棧中取出之前存儲的結果和操作符。

Step3.計算最後一個操作數。

Step4.返回最終結果。


ans1.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
public:
    int calculate(string s) {
        stack<int> nums;  // 存儲操作數
        stack<int> ops;   // 存儲操作符
        int num = 0;      // 當前操作數
        int result = 0;   // 最終結果
        int sign = 1;     // 符號,默認為正
        
        for (char c : s) {
            if (isdigit(c)) {
                num = num * 10 + (c - '0');  // 構建操作數
            } else if (c == '+' || c == '-') {
                result += sign * num;  // 計算結果
                num = 0;               // 重置當前操作數
                sign = (c == '+') ? 1 : -1;  // 更新操作符
            } else if (c == '(') {
                nums.push(result);
                ops.push(sign);
                result = 0;
                sign = 1;
            } else if (c == ')') {
                result += sign * num;
                num = 0;
                result *= ops.top();
                ops.pop();
                result += nums.top();
                nums.pop();
            }
        }
        
        result += sign * num;  // 處理最後一個操作數
        
        return result;
    }
};





Ref:
C++ isdigit()用法
LeetCode 224








留言

這個網誌中的熱門文章

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header

經得起原始碼資安弱點掃描的程式設計習慣培養(三)_7.Cross Site Scripting(XSS)_Stored XSS_Reflected XSS All Clients

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題