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

224. Basic Calculator的C++解法

都知道計算器應該用棧做,但是用棧到底做什麼需要想明白。基本計算器Ⅰ中只有加減和括號,不存在優先順序的問題,所以可以把符號看作正負號,每讀一個數就將其加到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;
    }
};