227. 基本计算器

实现一个基本的计算器来计算一个简单的字符串表达式的值。函数

字符串表达式仅包含非负整数,+, - ,*/ 四种运算符和空格  。 整数除法仅保留整数部分。spa

示例 1:code

输入: "3+2*2"
输出: 7

示例 2:blog

输入: " 3/2 "
输出: 1

示例 3:字符串

输入: " 3+5 / 2 "
输出: 5

说明:string

  • 你能够假设所给定的表达式都是有效的。
  • 请不要使用内置的库函数 eval

 

思路1:先把字符串里的全部数字和运算符都读取出来,再作完全部的乘法和除法运算,最后把全部的数按顺序加减。这里能够死板地用vector,也能够用栈。io

用vector的话,读取和计算是分开进行的;用栈,读取的时候就能够进行乘除,只把加减对应的数以及乘除后的结果放进栈。class

思路2:加减运算符实际上是顺序计算的标识,因此有这么一种思路。假设有 ...a1+...a1+,假设第一个加号前的结果已经获得记为total,第1个加号到第2个加号之间的结果也已获得即为tmp,当遇到第2个加号,就能够获得当前结果为total += tmp。注意全部的-a均可以转换为+(-a),也就是全为+。stream

class Solution {
public:
    int calculate3(string s) {
        vector<int> num;
        vector<char> ope;
        
        int i = 0;
        while(i<s.length()){
            if(s[i] == ' '){
                ++i;
            }
            else if(s[i] < '0'){
                ope.push_back(s[i]);++i;
            }
            else{
                int n = 0;
                while(i<s.length() && s[i] >= '0' && s[i] <= '9'){
                    n = n*10 + (s[i] - '0');
                    ++i;
                }
                num.push_back(n);
            }
        }
        
//        for(auto n:num) cout<<n<<" ";
//        cout<<endl;
//        for(auto i:ope) cout<<i<<" ";
//        cout<<endl;
        
        if(num.size() == ope.size() && ope[0] == '-'){
            num[0] = -num[0];
            ope.erase(ope.begin());
        }
        
        i = 0;
        while(i<ope.size()){
            if(ope[i] == '-' || ope[i] == '+'){
                ++i;
                continue;
            }
            int r;
            if(ope[i] == '*'){
                r = num[i]*num[i+1];
            }
            else if(ope[i] == '/'){
                r = num[i]/num[i+1];
            }
            num[i+1] = r;
            num.erase(num.begin() + i); 
            ope.erase(ope.begin() + i);
        }
        
        i = 0;
        for(;i<ope.size();++i){
            if(ope[i] == '+'){
                num[i+1] = num[i] + num[i+1];
            }
            else if(ope[i] == '-'){
                num[i+1] = num[i] - num[i+1];
            }
        }
        return num.back();
    }
    
    int calculate2(string s) {
        stack<int> num;
        istringstream is('+' + s);
        char op;
        int n;
        int tmp;
        while(is>>op && is>>n){
//            cout<<op<<endl;
//            cout<<n<<endl;
            
            if(op == '+' || op == '-'){
                n = op == '+' ? n : -n;
                num.push(n);
            }
            else{
                tmp = num.top();num.pop();
                if(op == '*') tmp = tmp*n;
                if(op == '/') tmp = tmp/n;
                num.push(tmp);
            }
        }
        
        n = 0;
        while(!num.empty()){
            tmp = num.top();num.pop();
            n += tmp;
        }
        return n;
    }
    
    // 参考:不用栈 
    // 这里的'+' 和 '-'相似去计算当前结果的一种标识 
    int calculate(string s)
    {
        istringstream in('+' + s + '+');
        long long total = 0, term = 0,n;
        char op;
        while (in>>op)
        {
            if (op == '+' or op == '-')
            {
                total += term;
                in>>term;
                term = op == '+' ? term : -term;
            }
            else
            {
                in>>n;
                if (op == '*')
                {
                    term *= n;
                }
                else
                {
                    term /= n;
                }
            }
        }
        return total;
    }
};
相关文章
相关标签/搜索