版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musechipin/article/details/85113568
都知道计算器应该用栈做,但是用栈到底做什么需要想明白。基本计算器Ⅰ中只有加减和括号,不存在优先级的问题,所以可以把符号看作正负号,每读一个数就将其加到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;
}
};