递归处理括号
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 37 38 39 40 41 42 43 44 45 46 47 48
| class Solution { public: int calculate(string s) { int i = 0; return helper(s, i); } private: int helper(string& s, int& i) { stack<int> stk; int num = 0; char preop = '+'; int n = s.size(); for(; i <= n; ++i) { auto ch = s[i]; if(ch == '(') { num = helper(s, ++i); continue; } if(ch == ' ') continue; if(i == n || ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == ')') { switch(preop) { case '-': stk.push(-num); break; case '+': stk.push(num); } if(ch == ')') break; num = 0; preop = ch; }else num = num * 10 + (ch - '0'); } int ret = 0; while(!stk.empty()) { ret += stk.top(); stk.pop(); } return ret; } };
|
没有*/这些,只需要处理符号就可以了,主要处理括号前符号会让括号内符号都变号
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 37 38 39 40
| class Solution { public: int calculate(string s) { int ret{ 0 }; int i{ 0 }; int n = s.size(); int sign{ 1 }; stack<int> stk; stk.push(1); while(i < n) { if(s[i] == ' ') ++i; else if(s[i] == '+') { ++i; sign = stk.top(); }else if(s[i] == '-') { ++i; sign = stk.top() * -1; }else if(s[i] == '(') { stk.push(sign); ++i; }else if(s[i] == ')') { stk.pop(); ++i; }else { long cur{ 0 }; while(i < n && s[i] <= '9' && s[i] >= '0') cur = cur * 10 + (s[i++] - '0'); ret += sign * cur; } } return ret; } };
|