题目链接:
分析:简单的模拟问题,借助栈这个数据结构,可以达到事半功倍的效果。
算法思路:题目的本质是对一些数字进行计算再求和。我们定义一个栈,存储可能用到的所有数字。首先遍历整个字符串,取出每个字符串分别进行处理。如果是“+”,那么将栈顶的两个元素出栈,计算两者的和,再将他们依次入栈;如果是“D”,那么取出栈顶元素,将其double一下,再将结果入栈;如果是“C”,那么直接将栈顶元素出栈即可;否则一定是数字,这里推荐大家一个函数stoi(),可以直接将字符串转换成对应的整数,我们将该整数直接入栈即可。不断模拟上述的过程直到遍历完整个vector。
此时,所有需要的数字已经被存储在我们自己定义的栈当中,此时我们只要依次取出栈中的所有元素再求和即可。
代码参考如下:
class Solution {
public:
int calPoints(vector<string>& operations) {
stack<int>s;//定义一个栈 存储现有的数
for(int i=0;i<operations.size();++i){//遍历字符串
string temp=operations[i];//取出每个字符串
if(temp=="+"){//如果是加号 模拟对应的加法操作
int a=s.top();
s.pop();
int b=s.top();
s.push(a);
s.push(a+b);
}else if(temp=="D"){//模拟对应的double操作
int a=s.top();
s.push(a*2);
}else if(temp=="C"){//模拟对应的弹出操作
s.pop();
}else{//存储对应的整数
int a=stoi(temp);//stoi函数的作用是将字符串直接转换成对应的整数
s.push(a);
}
}
int res=0;//定义最终的结果
while(!s.empty()){//遍历整个栈 累加求值
res+=s.top();
s.pop();
}
return res;//返回结果
}
};