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;
    }
};
相關文章
相關標籤/搜索