Leetcode每日一题 227.基本计算器 II

昨天的题基础上加了乘法和除法,但去除了括号,其实也很简单,既然知道了怎么利用栈实现基础的"1+1" ,那么乘法或除法只需要将栈中的上一个数a乘上或除以当前这个数b,得到c,然后让a出栈,c入栈就行了,这里可能会被先乘后除再加再减的数学计算规则给误导,如果再加上括号,导致越想越复杂,其实并没有那么难,因为我们维护的是一个保存了每一位数字的栈,遇到乘或除就按上面的方法过一遍,遇到加减直接将上一个数入栈就行,最后把栈内的每一个数加起来,就是我们要的结果。


227. 基本计算器 II

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

整数除法仅保留整数部分。

示例 1:
输入:s = "3+2*2"
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5

代码如下:

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()
{
char sign = '+';
stack<int> num;
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)
{
int tmp;
switch(sign){
case '+':num.push(sum);break;
case '-':num.push(-sum);break;
case '*':tmp = num.top() * sum;num.pop();num.push(tmp);break;
case '/':tmp = num.top() / sum;num.pop();num.push(tmp);break;
}
sign = c;
sum = 0;
}
if(c == ')')
break;
}

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

再加上昨天的括号递归处理,这样就能实现一个简单的完整的字符串式子的计算了。