复试上机准备之棒球赛
问题描述
第一届棒球比赛开赛啦。你现在是一名记分员,输入一个字符串数组(比赛记录情况),按如下规则计分:
- 如果该字符串是数字:代表当轮比赛的得分情况。
- 如果该字符串是“+”:代表当轮比赛得分情况为上两轮之和。
- 如果该字符串是“C”:代表上一轮得分无效。
- 如果该字符串是“D”:代表当轮比赛得分为上一轮得分的两倍。
你需要得出最后总的得分情况并返回结果。
例:
输入:52CD+
输出:30
解释:
第 1 轮得分 5 分,当前总共得分 5 分。
第 2 轮得分 2 分,当前总共得分 5+2=7 分。
第 3 轮取消上轮得分,当前总共得分 5 分。
第 4 轮获得上一轮双倍得分,当前总共得分 5+10=15 分。
第 5 轮获得上两轮得分之和,当前总共得分 15+5+10=30 分。
分析
这是一个==栈的应用==题,如果知道这一点解法就很简单了。
# 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;
}