# 224

Jul 2nd, 2021 (edited)
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. class Solution {
2. public:
3.     int calculate(string s) {
4.         long long int result=0;
5.         long long int num=0, sign=1;
6.         stack<long long int> nums, ops;
7.
8.         for(int i=0; i<s.size(); ++i){
9.             char c=s[i];
10.             if(c>='0' && c<='9'){
11.                 num=10*num + c-'0'; /// For case: "23"
12.             }else if(c=='+'){
13.                 result += num*sign; /// everytime meets an operator, sum up previous number
14.                 num=0;
15.                 sign=1;    /// sign is the sign of next number
16.             }else if(c=='-'){
17.                 result += num*sign; /// everytime meets an operator, sum up previous number
18.                 num=0;
19.                 sign=-1;
20.             }else if(c=='('){
21.                 nums.push(result); /// ...(1+3+(..xx..)+...)... before go into cur (..xx..), record the forefront result (in this case it is 1+3 ) into nums array
22.                 ops.push(sign);  // record cur (..xx..) sign
23.                 result=0;  // result is to record the total value in the cur (..xx..)
24.                 sign=1;
25.             }else if(c==')' && ops.size()){
26.                 result += num*sign; /// For case: 1-(5)
27.                 num=0;
28.                 result = result*ops.top() + nums.top();  // ...(1+3+(..xx..)+...)... sum up cur (..xx..)  and the forefront result (in this case it is 1+3 )
29.                 nums.pop();
30.                 ops.pop();
31.             }
32.         }
33.         result += num*sign; /// For the last one operation. consider the case:  1+2+3
34.         return result;
35.     }
36. };
37.
38. -----------------------------
39.
40. class Solution {
41. public:
42.     int calculate(string s) {
43.         int n = s.size(), ret = 0, sign = 1;
44.         stack<int> stk;
45.
46.         for (int i = 0; i < n; i++) {
47.             if (isdigit(s[i])) {
48.                 int num = s[i] - '0';
49.
50.                 while (i + 1 < n && isdigit(s[i + 1])) {
51.                     num = num * 10 + (s[i + 1] - '0');
52.                     i++;
53.                 }
54.
55.                 ret += sign * num;
56.             } else if (s[i] == '+') {
57.                 sign = 1;
58.             } else if (s[i] == '-') {
59.                 sign = -1;
60.             } else if (s[i] == '(') {
61.                 stk.push(ret);
62.                 stk.push(sign);
63.                 ret = 0;
64.                 sign = 1;
65.             } else if (s[i] == ')') {
66.                 ret *= stk.top();
67.                 stk.pop();
68.                 ret += stk.top();
69.                 stk.pop();
70.             }
71.         }
72.
73.         return ret;
74.     }
75. };