772. Basic Calculator III的C++解法
阿新 • • 發佈:2018-12-25
一開始我想的是跟Ⅱ的做法差不多,但是Ⅱ的做法有個缺陷,就是隻有最後才能得到加在一起的結果,對於括號內的算式而言,也沒有辦法像Ⅰ一樣一次就算出全部的結果形成一個運算元,除非在棧內標識出括號的邊界。可是這樣一來就變得非常複雜。
所以這個題使用了遞迴,一個值得注意的處理方法時對於巢狀括號的算式如何找到每個'('對應的')',用一個變數cnt,遇到左括號自增1,遇到右括號自減1,當cnt為0的時候,說明括號正好完全匹配。
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 index = 0; int op=1; if (!s.empty()) { while ((index = s.find(' ', index)) != string::npos) s.erase(index, 1); } int i=0; int cal=0; int bracket=0; while (i<s.length()) { if (numbers.count(s[i]) != 0) { cal = s[i] - 48; while (numbers.count(s[i + 1]) != 0) { cal = cal * 10 + s[i + 1] - 48; i++; } if (op==1) ns.push(cal); else if (op==2) ns.push(-1*cal); else if (op==3){int a=ns.top(); ns.pop(); ns.push(a*cal);} else if (op==4){int a=ns.top(); ns.pop(); ns.push(a/cal);} } else if (s[i]=='-') op=2; else if (s[i]=='+') op=1; else if (s[i]=='*') op=3; else if (s[i]=='/') op=4; else if (s[i]=='(') { int j=i;int cnt=0; for (j;j<s.length();j++) { if (s[j]=='(') cnt++; if (s[j]==')')cnt--; if (cnt==0) break; } cal=calculate(s.substr(i + 1, j- i - 1)); if (op==1) ns.push(cal); else if (op==2) ns.push(-1*cal); else if (op==3){int a=ns.top(); ns.pop(); ns.push(a*cal);} else if (op==4){int a=ns.top(); ns.pop(); ns.push(a/cal);} i=j; } i++; } while (!ns.empty()) { res=res+ns.top(); ns.pop(); } return res; } };