實現一個基本的計算器來計算一個簡單的字符串表達式的值。函數
字符串表達式僅包含非負整數,+
, -
,*
,/
四種運算符和空格
。 整數除法僅保留整數部分。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; } };