0%

224. 基本计算器

224. 基本计算器

递归处理括号

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;
}
};