224.Basic Calculator
思路:这次代码写的有点冗长,看看思路就行。用栈。先去掉空白。然后遇到(就保存下标记,遇到)一直出栈并累加值,直到遇到第一个标记,将新值入栈;如果既不是(也不是),就将该值直接入栈。当遍历完所有字符之后,再将栈中的元素全部累加,return。
class Solution { public:
int calculate(string s) {
stack<pair<int,char> > add_container;
int len=s.size();
//去掉空白
int k=0;
for(int i=0;i<len;++i){
if(s[i]!=' '){
s[k++]=s[i];
}
}
len=k;//去掉空白后的新长度
int i=0;
int sum;
while(i<len){
switch(s[i]){
case '+'://如果当前是+号,并且后面是(,就做下标记:make_pair(0,'+');否则就将后面的所有数加起来然后将和入栈make_pair(sum,0)
i++;
if(i<len && s[i]!='('){
sum=0;
while(i<len && s[i]>='0' && s[i]<='9'){
sum=(sum*10+s[i]-'0');
i++;
}
add_container.push(make_pair(sum,0));
}else if(i<len && s[i]=='('){
add_container.push(make_pair(0,'+'));
i++;
}
break;
case '-'://如果当前是-号,并且后面是(,就做下标记:make_pair(0,'-');否则就将后面的所有数加起来然后将和入栈make_pair(sum,0)
i++;
if(i<len && s[i]!='('){
sum=0;
while(i<len && s[i]>='0' && s[i]<='9'){
sum=(sum*10+'0'-s[i]);
i++;
}
add_container.push(make_pair(sum,0));
}else if(i<len && s[i]=='('){
add_container.push(make_pair(0,'-'));
i++;
}
break;
case '('://跳过
i+=1;
break;
case ')'://将栈顶元素的和累加,然后出栈,直到遇到第一个make_pair(0,'+')或make_pair(0,'-')或栈为空。然后将累加的和入栈
sum=0;
while(!add_container.empty() && add_container.top().second!='+' && add_container.top().second!='-'){
sum+=add_container.top().first;
add_container.pop();
}
if(!add_container.empty()){
if(add_container.top().second=='+'){
add_container.pop();
add_container.push(make_pair(sum,0));
}else if(add_container.top().second=='-'){
add_container.pop();
add_container.push(make_pair(-sum,0));
}
}else{
add_container.push(make_pair(sum,0));
}
i+=1;
break;
default://直接将值累加,然后将累加后的和入栈就行
sum=0;
while(i<len && s[i]>='0' && s[i]<='9'){
sum=(sum*10+s[i]-'0');
i++;
}
add_container.push(make_pair(sum,0));
break;
}
}
int result=0;
while(!add_container.empty()){
result+=add_container.top().first;
add_container.pop();
}
return result;
}
};