复试上机准备之棒球赛

Author Avatar
Patrick 3月 07, 2019

问题描述

第一届棒球比赛开赛啦。你现在是一名记分员,输入一个字符串数组(比赛记录情况),按如下规则计分:

  1. 如果该字符串是数字:代表当轮比赛的得分情况。
  2. 如果该字符串是“+”:代表当轮比赛得分情况为上两轮之和。
  3. 如果该字符串是“C”:代表上一轮得分无效。
  4. 如果该字符串是“D”:代表当轮比赛得分为上一轮得分的两倍。

你需要得出最后总的得分情况并返回结果。

例:

输入:52CD+

输出:30

解释:

第 1 轮得分 5 分,当前总共得分 5 分。

第 2 轮得分 2 分,当前总共得分 5+2=7 分。

第 3 轮取消上轮得分,当前总共得分 5 分。

第 4 轮获得上一轮双倍得分,当前总共得分 5+10=15 分。

第 5 轮获得上两轮得分之和,当前总共得分 15+5+10=30 分。

分析

这是一个==栈的应用==题,如果知道这一点解法就很简单了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# include <iostream>
# include <string>

using namespace std;

int main() {
string str;
int stack[105];

while (cin >> str) {
int top = 0;
for (int i = 0; i < str.length(); ++i) {
if (str[i] == 'C') {
--top;
}
else if (str[i] == 'D') {
stack[top] = 2 * stack[top - 1];
++top;
}
else if (str[i] == '+') {
stack[top] = stack[top - 1] + stack[top - 2];
++top;
}
else {
stack[top++] = str[i] - '0';
}
}

int sum = 0;
for (int i = 0; i < top; ++i) {
sum += stack[i];
}
cout << sum << endl;
}

return 0;
}