表达式计算的题目考研的时候做过很多了,更复杂的也见过,比如包含负数和乘除的,其实思路都是利用操作栈和操作数栈来记录计算顺序,最终得到结果。
class Solution {
public:
int calculate(string s)
{
stack<char> ops;
stack<int> nums;
int curnum = 0;
for(int i=0;i<s.size();++i)
{
char c=s[i];
#跳过空格
if(c==' ') continue;
#'+'/'-'/'('直接入栈
if(c=='('||c=='+'||c=='-'){ops.push(c);continue;}
#')'来时栈顶只有'('所以弹出
if (c==')') ops.pop();
#计算好几个数字连在一起的数值
else if(isdigit(c))
{
curnum=curnum*10+(c-'0');
if(i+1<s.size()&&isdigit(s[i+1])) continue;
nums.push(curnum);
curnum=0;
}
#若操作符栈空或栈顶元素为'('说明数字栈为空或左操作数,先不做计算
if (ops.empty()||ops.top()=='(') continue;
#否则可以进行计算
int n2=nums.top();nums.pop();
if (ops.top()=='+') nums.top()+=n2;
else if(ops.top()=='-')nums.top()-=n2;
ops.pop();
}
return nums.top();
}
};