224.Basic Calculator

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;
    }
};