复试上机准备之棒球赛

Author Avatar
patrickcty 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 分。

分析

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

# 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;
}