224. Basic Calculator的C++解法
阿新 • • 發佈:2018-12-25
都知道計算器應該用棧做,但是用棧到底做什麼需要想明白。基本計算器Ⅰ中只有加減和括號,不存在優先順序的問題,所以可以把符號看作正負號,每讀一個數就將其加到res上即可。棧在這裡用於處理括號,當遇上'('時,視作一個新算式的開始,將前面已經算完的結果和這個新算式的符號(即讀到的最新正負號)壓入棧中,然後將res和sign重置。等遇上')'意味著新算式已經算完,結果存在res中看作一個算式新得到的運算數,將這個運算數和前面存在棧中的之前結果相加即可。
class Solution { public: int calculate(string s) { set<char> numbers = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; stack<int> ns; int res=0; int sign=1; int index = 0; if (!s.empty()) { while ((index = s.find(' ', index)) != string::npos) s.erase(index, 1); } int i=0; while (i<s.length()) { if (numbers.count(s[i]) != 0) { int cal = s[i] - 48; while (numbers.count(s[i + 1]) != 0) { cal = cal * 10 + s[i + 1] - 48; i++; } res=res+sign*cal; } else if (s[i]=='-') sign=-1; else if (s[i]=='+') sign=1; else if (s[i]=='(') { ns.push(res); ns.push(sign); res=0; sign=1; } else if (s[i]==')') { res=res*ns.top(); ns.pop(); res=res+ns.top(); ns.pop(); } i++; } return res; } };