1. 程式人生 > >772. Basic Calculator III的C++解法

772. Basic Calculator III的C++解法

一開始我想的是跟Ⅱ的做法差不多,但是Ⅱ的做法有個缺陷,就是隻有最後才能得到加在一起的結果,對於括號內的算式而言,也沒有辦法像Ⅰ一樣一次就算出全部的結果形成一個運算元,除非在棧內標識出括號的邊界。可是這樣一來就變得非常複雜。
  所以這個題使用了遞迴,一個值得注意的處理方法時對於巢狀括號的算式如何找到每個'('對應的')',用一個變數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;
    }
};