
解题思路:
把1-(5-2+3)+(6-2)转换为1-5+2-3+6-2,来处理。

1 初始化图中的变量
2 数字1前面是+号,所以sign=1,res=0+1=1;
3 遇到负号‘-’,sign=-1;
4 遇到左括号‘(’,将负号放入栈中,即-1压栈,目的是为了让括号里面的符号都变号;
5 遇到数字5,sign=-1,res+=sign*num,即res=1-5=-4;
6 遇到负号‘-’,sign=-op.top(),此时栈op的顶部是刚刚压入栈中的左括号前的符号‘-’,即-1,所以sign=1,也就是括号外是减号,去掉括号要变号;
以下按这个流程走下去,就可以计算出最终结果。
class Solution {
public:
int calculate(string s) {
stack<int> op; //存放符号
op.push(1); //1代表+号,-1代表-号
int sign=1; //sign是每个数字前面的符号
int n=s.size(); //字符串长度
int res=0; //记录结果
int i=0; //记录当前位置
while(i<n){
if(s[i]==' '){
i++;
}else if(s[i]=='+'){
sign=op.top();
i++;
}else if(s[i]=='-'){
sign=-op.top();
i++;
}else if(s[i]=='('){
op.push(sign); //把括号前的符号放进栈中
i++;
}else if(s[i]==')'){
op.pop(); //弹出括号前的符号
i++;
}else{
long num=0;
while(i<n&&s[i]>='0'&&s[i]<='9'){
num=num*10+(s[i]-'0');
i++;
}
res+=sign*num;
}
}
return res;
}
};

class Solution {
public:
int calculate(string s) {
int n = s.size(), curRes = 0, res = 0;
long num=0;
char op = '+';
for (int i = 0; i < n; ++i) {
char c = s[i];
if (c >= '0' && c <= '9') {
num = num * 10 + c - '0';
} else if (c == '(') {
int j = i, cnt = 0;
for (; i < n; ++i) {
if (s[i] == '(') ++cnt;
if (s[i] == ')') --cnt;
if (cnt == 0) break;
}
num = calculate(s.substr(j + 1, i - j - 1));
}
//遇到加减乘除号,先要处理前面的
if (c == '+' || c == '-' || c == '*' || c == '/' || i == n - 1) {
//先根据op的值对num进行分别的加减乘除的处理,结果保存到curRes中
switch (op) {
case '+': curRes += num; break;
case '-': curRes -= num; break;
case '*': curRes *= num; break;
case '/': curRes /= num; break;
}
//假如当前字符是加或减或最后一个数了,把符号前面的结果加到res中
if (c == '+' || c == '-' || i == n - 1) {
res += curRes;
curRes = 0;
}
//更新op、num,也就是下一次的运算符号
op = c;
num = 0;
}
}
return res;
}
};
236

被折叠的 条评论
为什么被折叠?



