题目:
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:
整数 x - 表示本回合新获得分数 x
1."+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
2."D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
3."C" - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
请你返回记录中所有得分的总和。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/baseball-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题用到了栈的思想,用switch来实现题目中的各种功能,当出现字符数组中的数字时,将数字压入栈中,遇到运算符号时,将运算后的结果压入栈中,每次执行后都更新sum值,最后输出sum。
以下是代码实现
int calPoints(char** operations, int operationsSize) {
int sum = 0,i,top = -1;
int Stack[operationsSize];
for (i = 0; i <operationsSize; i++) {
switch (operations[i][0])
{
case '+'://遇到 + 号时,将栈顶的两个数相加,同时将相加后新的数压入栈中
Stack[++top] = Stack[top] + Stack[top - 1];
sum += Stack[top];
break;
case 'C'://更新sum值,同时将栈顶的数出栈
sum -= Stack[top];
Stack[top--];
break;
case 'D'://将当前栈顶的值×2,之后压入栈中
Stack[++top] = Stack[top] * 2;
sum += Stack[top];
break;
default://atoi的作用是将字符串转换为一个整数
Stack[++top] = atoi(operations[i]);
sum += Stack[top];
break;
}
}
return sum;
}