题目大意:给出一个字符串形式的计算表达式,由整数,左右括号,加减符号组成 计算其结果。
算法思想:
边扫描字符串,边计算结果,当扫到一个数时将其记录到num中,扫描到非数的时候讲之前的数通过计算存到res中,然后判断扫描操作符如果为'+'号将sign标记为1,如果为‘-’则sign标记为-1,如果为‘(’则将当前结果和操作符入栈,来计算括号内的表达式,如果遇到‘)’则说明括号内的表达式计算完成分别取操作数栈顶和符号栈顶 来计算出当前的结果。按此操作,直至字符串扫描完毕。将最后的操作数计算入结果中。
代码如下:
class Solution {
public:
int calculate(string s) {
if(s.size()==0) return 0;
stack<int> nums,ops;
int res=0;//记录当前结果
int num=0;//读取到的操作数
int sign=1;//记录操作符
for(char c:s){
if(isdigit(c)){
num=num*10+c-'0';
}
else{//遇见符号
res+=num*sign;
num=0;
if(c=='+') sign=1;
if(c=='-') sign=-1;
if(c=='('){
nums.push(res);
ops.push(sign);
res=0;//还原
sign=1;
}
if(c==')'){
res=res*ops.top()+nums.top();
ops.pop();
nums.pop();
}
}
}
res+=sign*num;
return res;
}
};