Leetcode每日一题 224.基本计算器

昨天刚到剑指offer里面看到这道题,今天每日一题刚好就是它...

224. 基本计算器

实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。

示例 1:
输入:s = "1 + 1"
输出:2
示例 2

输入:s = 2-1 + 2
输出:
3

示例 3

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

以前写过类似的判断括号的问题,想不起来是哪一道了..反正上次是被虐了,不过这次一下就想出来了,我们要思考的第一步是,如何判断最简单的式子,比如"1+1"或者"1+2-3+4-5"类似这种,万能的栈又来了,就不多说了,因为题目里只有加减法,然后加上括号,不过括号还是很好处理的,不用想太复杂,因为括号的最里面绝对是基础式子,回到了简单的"1+1",所以我们只需要用一个递归结构就行了,遇到“(”进入递归,遇到“)”跳出递归,返回一个值,就是括号的和,最后的最后就会变成基础式。


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
49
50
51
52
53
54
class Solution {
public:
inline bool isdigit(char c)
{
return c>='0'&&c<='9';
}
public:
string s;
int i;
int s_size;
int dfs(){
stack<int> num;
char sign = '+';
long long sum = 0;

while(i < s_size)
{
char c = s[i++];
if(isdigit(c))
sum = sum*10 + (c - '0');

if(c == '(')
sum = dfs();

if((!isdigit(c)&&c!=' ')||i>=s_size)
{
switch(sign){
case '+':num.push(sum);break;
case '-':num.push(-sum);break;
}
sign = c;
sum = 0;
}

if(c == ')')
break;
}

long long res = 0;
while(!num.empty())
{
res+=num.top();
num.pop();
}
return res;
}
int calculate(string s) {
this->i = 0;
this->s = s;
this->s_size = s.size();

return dfs();
}
};