先上代码
class Solution {
public:
int calculate(string s) {
stack<int> nums;
char ss[s.size()];
int j = 0;
for(int i = 0 ; i < s.size() ; i++)
{
if(s[i]!=' ')
{
ss[j++] = s[i];//<j
}
}
int d = 0;
char sign = '+';
for( int i = 0 ; i < j ; i++ )
{
if(ss[i] >= '0')
{
d=d*10 -'0'+ss[i];
}
if(ss[i] < '0' || i == j-1)
{
if(sign == '+')
{
nums.push(d);
}
if(sign == '-')
{
nums.push(-d);
}
if (sign == '*' )
{
int a = nums.top();
nums.pop();
nums.push(a*d);
}
if(sign == '/')
{
int a = nums.top();
nums.pop();
nums.push(a/d);
}
d = 0;
sign = ss[i];
}
}
int ans = 0;
while(!nums.empty())
{
ans += nums.top();
nums.pop();
}
return ans;
}
};
因为空格的处理有些麻烦,索性单独创建一个数组先把空格全剔除掉。
然后只单独用一个数字栈,每次遇到完整数字(可能是一位数或n位数)后的运算符(s[i]表示)时,判断这个完整数字的前面的运算符(用sign表示),若sign是乘除法,直接与栈顶进行计算替换栈顶数字,若是加减法就把d也入栈,最后将栈中所有加数相加就是计算结果。