你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
1.整数(一轮的得分):直接表示您在本轮中获得的积分数。
2. "+"(一轮的得分):表示本轮获得的得分是前两轮有效 回合得分的总和。
3. "D"(一轮的得分):表示本轮获得的得分是前一轮有效 回合得分的两倍。
4. "C"(一个操作,这不是一个回合的分数):表示您获得的最后一个有效 回合的分数是无效的,应该被移除。

每一轮的操作都是永久性的,可能会对前一轮和后一轮产生影响。
你需要返回你在所有回合中得分的总和。
示例 1:

  1. 输入: ["5","2","C","D","+"]
  2. 输出: 30
  3. 解释:
  4. 1轮:你可以得到5分。总和是:5
  5. 2轮:你可以得到2分。总和是:7
  6. 操作1:第2轮的数据无效。总和是:5
  7. 3轮:你可以得到10分(第2轮的数据已被删除)。总数是:15
  8. 4轮:你可以得到5 + 10 = 15分。总数是:30

示例 2:

  1. 输入: ["5","-2","4","C","D","9","+","+"]
  2. 输出: 27
  3. 解释:
  4. 1轮:你可以得到5分。总和是:5
  5. 2轮:你可以得到-2分。总数是:3
  6. 3轮:你可以得到4分。总和是:7
  7. 操作1:第3轮的数据无效。总数是:3
  8. 4轮:你可以得到-4分(第三轮的数据已被删除)。总和是:-1
  9. 5轮:你可以得到9分。总数是:8
  10. 6轮:你可以得到-4 + 9 = 5分。总数是13
  11. 7轮:你可以得到9 + 5 = 14分。总数是27

注意:

  • 输入列表的大小将介于1和1000之间。
  • 列表中的每个整数都将介于-30000和30000之间。

堆栈

  1. class Solution {
  2. public:
  3. int calPoints(vector<string>& ops) {
  4. if(ops.size() == 0){
  5. return 0;
  6. }
  7. stack<int> scores;
  8. int sum = 0;
  9. for(int i = 0; i<ops.size(); i++){
  10. if(scores.empty()){
  11. scores.push(stoi(ops[i]));
  12. sum += stoi(ops[i]);
  13. }else{
  14. if(ops[i] == "C"){
  15. int temp = scores.top();
  16. scores.pop();
  17. sum -= temp;
  18. }else if(ops[i] == "D"){
  19. int temp = scores.top();
  20. scores.push(2 * temp);
  21. sum += 2 * temp;
  22. }else if(ops[i] == "+"){
  23. int temp = scores.top();
  24. scores.pop();
  25. int temp_1 = scores.top();
  26. scores.push(temp);
  27. scores.push(temp + temp_1);
  28. sum += temp + temp_1;
  29. }else{
  30. scores.push(stoi(ops[i]));
  31. sum += stoi(ops[i]);
  32. }
  33. }
  34. }
  35. return sum;
  36. }
  37. };