比起Ⅰ来,Ⅱ多了乘除法,少了括号。我们还是以每一个数字为单位,'+'和 '-' 都看作数字的正负,将数字压栈。'*'和'/'时先将符号记录下来,读出下一个数字时直接从栈顶弹出最近的操作数进行运算,然后将结果压栈。
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;
char op='+';
if (!s.empty())
{
while ((index = s.find(' ', index)) != string::npos)
s.erase(index, 1);
}
int i=0;
int cal=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=='+') ns.push(cal);
else if (op=='-') ns.push(-1*cal);
else if (op=='*'){int a=ns.top(); ns.pop(); ns.push(a*cal);}
else if (op=='/'){int a=ns.top(); ns.pop(); ns.push(a/cal);}
}
else if (s[i]=='-') op='-';
else if (s[i]=='+') op='+';
else if (s[i]=='*') op='*';
else if (s[i]=='/') op='/';
i++;
}
while (!ns.empty())
{
res=res+ns.top();
ns.pop();
}
return res;
}
};