227. Basic Calculator 2

这道题和 282. Expression Add Operators(http://blog.csdn.net/revoir/article/details/51167848) 非常相似。把相乘和相除集体看成一个计算单元,加减分隔开的计算单元一个个的放到memo里面。这个方法要过两遍。

int calculate(string s) {
        vector<int> memo;
        char sign='+';
        for(int i=0;i<s.size();++i){
            int num=0;
            if(s[i]>='0'&&s[i]<='9'){
                while(i<s.size()&&s[i]>='0'&&s[i]<='9'){
                    num=num*10+s[i]-'0';
                    ++i;
                }
                if(sign=='+')
                    memo.push_back(num);
                else if(sign=='-')
                    memo.push_back(-num);
                else { 
                    int temp=memo.back();
                    memo.pop_back();
                    if(sign=='*')
                        memo.push_back(temp*num);
                    if(sign=='/'){
                        if(num==0)
                            return INT_MAX;
                        memo.push_back(temp/num);
                    }
                }
                --i;
                num=0;
            }
            else if(s[i]!=' ') sign=s[i];
        }
        int res=0;
        for(auto i:memo) res+=i;
        return res;
    }


这道题还有一个思路就是用两个stack,一个存数字一个存符号。


另外我还见到了一个超级简洁的方法。我是写不出来,贴上来学习一下吧

nt calculate(string s) {
        istringstream in(s + "+");
        long long total = 0, term, sign = 1, n;
        in >> term;
        char op;
        while (in >> op) {
            if (op == '+' || op == '-') {
                total += sign * term;
                sign = 44 - op; //op == '+' ? 1 : -1
                in >> term;
            } else {
                in >> n;
                if (op == '*')
                    term *= n;
                else
                    term /= n;
            }
        }
        return total;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值