不用栈
从左到右依次进行
时间复杂度O(n)
因为只有加减法所以从左到右依次进行,只要优先计算括号内的就可以
遇到左括号就调用函数先去计算括号内的,遇到右括号就进行返回,
返回的是与当前右括号对应的一组括号内的值
所以有括号内叠括号的情况也会依次调用计算,不会影响计算顺序
注意不同情况p停留在的位置,要进行适当的自加使其继续。
class Solution {
public:
int p = 0; //指针位置
int calculate(string s) {
int res = 0;
int flag = 1;
while(p < s.size()){
if(s[p] == ' '){
p++; continue;
}
if(s[p] == ')'){
return res; //遇到右括号说明是由左括号进行的调用,要返回这部分结果
}else if(s[p] == '('){
p++; //跳过左括号
res = res + flag * calculate(s); //调用函数计算括号中的
p++; //跳过右括号
}else if(s[p] == '+'){
flag = 1;
p++;
}else if(s[p] == '-'){
flag = -1;
p++;
}else{
//数字的情况,如果取值这部分写成函数最后一个例子会超时
int x = 0;
while(s[p] <= '9' && s[p] >= '0')
x = x * 10 + (s[p++] - '0');
res = res + flag * x;
}
}
return res;
}
};
复杂度太高了