# 基本计算器

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

示例 1:

输入:s = "1 + 1"

输出:2

示例 2:

输入:s = " 2-1 + 2 "

输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"

输出:23

提示:

以下错误的选项是?

## aop ### before ```c #include using namespace std; ``` ### after ```c int main() { Solution sol; int res; string s1 = "(1+(4+5+2)-3)+(6+8)"; res = sol.calculate(s1); cout << res; return 0; } ``` ## 答案 ```c class Solution { public: int calculate(string s) { stack expr, nums, ops; int cur = 0, len = s.size(); string tmp = ""; while (cur < len) { switch (s[cur]) { case ' ': break; case '+': case '-': case '(': if (tmp != "") { expr.push(tmp); tmp = ""; } expr.push(tmp + s[cur]); break; case ')': { if (tmp != "") { expr.push(tmp); tmp = ""; } int caled = calculate(expr); expr.push(intToStr(caled)); break; } default: tmp += s[cur]; break; } ++cur; } if (tmp != "") expr.push(tmp); return calculate(expr); } private: int calculate(stack &s) { stack nums; stack ops; string top; while (!s.empty() && (top = s.top()) != "(") { if (top == "+" || top == "-") ops.push(top[0]); else nums.push(strToInt(top)); s.pop(); } if (!s.empty()) s.pop(); int ans = nums.top(), num; nums.pop(); while (!ops.empty()) { num = nums.top(); nums.pop(); if (ops.top() == '+') ans += num; else ans -= num; } return ans; } int strToInt(string s) { int ans = 0, len = s.size(); if (len == 0) return 0; int symbol = s[0] == '-' ? -1 : 1; for (int i = s[0] == '+' || s[0] == '-' ? 1 : 0; i < len; ++i) { ans *= 10; ans += s[i] - '0'; } return ans * symbol; } string intToStr(int num) { if (num == 0) return "0"; int symbol = num >= 0 ? 1 : -1; string s = ""; num *= symbol; while (num) { s = (char)(num % 10 + '0') + s; num /= 10; } if (symbol == -1) s = "-" + s; return s; } }; ``` ## 选项 ### A ```c class Solution { public: int calculate(string s) { stack conclude; stack fuhao; int i = 0, len = s.length(); while (i < len) { if (s[i] == ' ') i++; else if (s[i] == '(') { fuhao.push('('); i++; } else if (s[i] == ')') { if (fuhao.top() != '(') { long x = conclude.top(); conclude.pop(); long y = conclude.top(); conclude.pop(); if (fuhao.top() == '+') conclude.push(y + x); else conclude.push(y - x); fuhao.pop(); } fuhao.pop(); i++; } else if (s[i] == '+' || s[i] == '-') { if (!fuhao.empty() && fuhao.top() != '(') { long x = conclude.top(); conclude.pop(); long y = conclude.top(); conclude.pop(); if (fuhao.top() == '+') conclude.push(y + x); else conclude.push(y - x); fuhao.pop(); } fuhao.push(s[i]); i++; } else { long x = s[i] - '0'; i++; while (i < len && s[i] <= '9' && s[i] >= '0') { x = x * 10 + (s[i] - '0'); i++; } conclude.push(x); } } if (!fuhao.empty()) { long x = conclude.top(); conclude.pop(); long y = conclude.top(); conclude.pop(); if (fuhao.top() == '+') conclude.push(y + x); else conclude.push(y - x); fuhao.pop(); } return conclude.top(); } }; ``` ### B ```c class Solution { public: int calculate(string s) { static const int STATE_BEGIN = 0; static const int NUMBER_STATE = 1; static const int OPERATION_STATE = 2; long number = 0; int STATE = STATE_BEGIN; int computer_flag = 0; for (int i = 0; i < s.length(); i++) { if (s[i] == ' ') { continue; } switch (STATE) { case STATE_BEGIN: if (s[i] >= '0' && s[i] <= '9') { STATE = NUMBER_STATE; } else { STATE = OPERATION_STATE; } i--; break; case NUMBER_STATE: if (s[i] >= '0' && s[i] <= '9') { number = number * 10 + s[i] - '0'; } else { number_stack.push(number); if (computer_flag == 1) { computer(number_stack, operation_stack); } number = 0; i--; STATE = OPERATION_STATE; } break; case OPERATION_STATE: if (s[i] == '+' || s[i] == '-') { operation_stack.push(s[i]); computer_flag = 1; } else if (s[i] == '(') { computer_flag = 0; } else if (s[i] >= '0' && s[i] <= '9') { STATE = NUMBER_STATE; i--; } else if (s[i] == ')') { computer(number_stack, operation_stack); } break; } } if (number != 0) { number_stack.push(number); computer(number_stack, operation_stack); } if (number == 0 && number_stack.empty()) { return 0; } return number_stack.top(); } void computer(stack &number_stack, stack &operation_stack) { if (number_stack.size() < 2) { return; } int num2 = number_stack.top(); number_stack.pop(); int num1 = number_stack.top(); number_stack.pop(); if (operation_stack.top() == '+') { number_stack.push(num1 + num2); } else if (operation_stack.top() == '-') { number_stack.push(num1 - num2); } operation_stack.pop(); } private: stack number_stack; stack operation_stack; }; ``` ### C ```c class Solution { public: void sum(vector &stk) { vector temp; while (!stk.empty() && stk.back() != "(") { temp.push_back(stk.back()); stk.pop_back(); } if (!stk.empty() && stk.back() == "(") stk.pop_back(); if (temp.back() != "-") temp.emplace_back("+"); reverse(temp.begin(), temp.end()); int ret = 0; int n = temp.size(); for (int i = 0; i < n - 1; i += 2) { int num = stoi(temp[i + 1]); if (temp[i] == "-") num *= (-1); ret += num; } stk.push_back(to_string(ret)); } int calculate(string s) { vector stk; int n = s.size(); int ret = 0; string temp; for (int i = 0; i < n; ++i) { if (isdigit(s[i])) { temp += s[i]; } else if (s[i] == '+' || s[i] == '-') { if (!temp.empty()) { stk.push_back(temp); temp.clear(); } temp += s[i]; stk.push_back(temp); temp.clear(); } else if (s[i] == '(') { temp += s[i]; stk.push_back(temp); temp.clear(); } else if (s[i] == ')') { stk.push_back(temp); temp.clear(); sum(stk); } } if (!temp.empty()) stk.push_back(temp); sum(stk); if (stk.size() == 1) ret = stoi(stk[0]); return ret; } }; ```