## [224\. Basic Calculator](https://leetcode.com/problems/basic-calculator/) Given a string `s` representing a valid expression, implement a basic calculator to evaluate it, and return _the result of the evaluation_. **Note:** You are **not** allowed to use any built-in function which evaluates strings as mathematical expressions, such as `eval()`. **Example 1:** **Input:** s = "1 + 1" **Output:** 2 **Example 2:** **Input:** s = " 2-1 + 2 " **Output:** 3 **Example 3:** **Input:** s = "(1+(4+5+2)-3)+(6+8)" **Output:** 23 **Constraints:** - `1 <= s.length <= 3 * 105` - `s` consists of digits, `'+'`, `'-'`, `'('`, `')'`, and `' '`. - `s` represents a valid expression. - `'+'` is **not** used as a unary operation (i.e., `"+1"` and `"+(2 + 3)"` is invalid). - `'-'` could be used as a unary operation (i.e., `"-1"` and `"-(2 + 3)"` is valid). - There will be no two consecutive operators in the input. - Every number and running calculation will fit in a signed 32-bit integer. ```cpp= class Solution { public: int calculate(string s) { stack<int> stk; int res = 0; int sign = 1; int operand = 0; for(int i = 0; i < s.size(); i++) { char c = s[i]; if(isdigit(c)) { operand = 10 * operand + (c - '0'); } else if(c == '+') { res += sign * operand; sign = 1; // 已經將答案存到 res 了,operand reset 為 0 operand = 0; } else if(c == '-') { res += sign * operand; sign = -1; // 已經將答案存到 res 了,operand reset 為 0 operand = 0; } else if(c == '(') { // 將結果暫時存到 stack stk.push(res); // 也將 sign 暫時存到 stack stk.push(sign); // reset 結果為 0,重新計算 res = 0; // reset sign 為 1,重新計算 sign = 1; } else if(c == ')') { // 加上目前的計算 res += sign * operand; // 乘上之前運算的結果的 sign res *= stk.top(); stk.pop(); // 加上之前運算的結果 res += stk.top(); stk.pop(); // reset operand 為 0 operand = 0; } } return res + (sign * operand); } }; ``` :::success - 時間複雜度:$O(N)$ - 空間複雜度:$O(N)$ :::