wordpress建站图片效果/磁力蜘蛛
🙉饭不食,水不饮,题必须刷🙉
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?先看简单题! 🧡《C语言入门100例》🧡
数据结构难?不存在的! 🌳《画解数据结构》🌳
LeetCode 太简单?算法学起来! 🌌《夜深人静写算法》🌌
文章目录
- 一、题目
- 1、题目描述
- 2、基础框架
- 3、原题链接
- 二、解题报告
- 1、思路分析
- 2、时间复杂度
- 3、代码详解
- 三、本题小知识
一、题目
1、题目描述
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:
整数x
- 表示本回合新获得分数x
"+"
- 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
"D"
- 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
"C"
- 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。请你返回记录中所有得分的总和。
样例输入:ops = ["5","2","C","D","+"]
样例输出: 30
2、基础框架
- C语言 版本给出的基础框架代码如下:
int calPoints(char ** ops, int opsSize){
}
3、原题链接
LeetCode 682. 棒球比赛
二、解题报告
1、思路分析
总共四种操作,分别模拟处理即可:
x
:字符串转换成整数后入栈;
+
:取 栈顶 和 次栈顶 元素相加后入栈;
D
:将栈顶元素乘 2 后入栈;
C
:出栈;
- 最后就是依次出栈,然后累加所有元素的和了。
- 有关 栈 的实现,可以参见以下文章:《画解数据结构》栈。
2、时间复杂度
- 由于每个括号最多入栈一次,出栈一次。
- 所以时间复杂度:O(n)O(n)O(n)
3、代码详解
/************************************* 栈的顺序表实现 *************************************/
#define DataType int
#define maxn 100010struct Stack {DataType data[maxn];int top;
};void StackClear(struct Stack* stk) {stk->top = 0;
}
void StackPushStack(struct Stack *stk, DataType dt) {stk->data[ stk->top++ ] = dt;
}
void StackPopStack(struct Stack* stk) {--stk->top;
}DataType StackGetTop(struct Stack* stk) {return stk->data[ stk->top - 1 ];
}
int StackGetSize(struct Stack* stk) {return stk->top;
}
bool StackIsEmpty(struct Stack* stk) {return !StackGetSize(stk);
}
/************************************* 栈的顺序表实现 *************************************/struct Stack stk;int calPoints(char ** ops, int opsSize){int i, sum;int topval, nowval;StackClear(&stk); for (i = 0; i < opsSize; ++i) {if( !strcmp(ops[i], "+") ) {topval = StackGetTop(&stk); // (1)StackPopStack(&stk); // (2)nowval = topval + StackGetTop(&stk); // (3)StackPushStack(&stk, topval); // (4)StackPushStack(&stk, nowval); // (5)}else if( !strcmp(ops[i], "D") ) {StackPushStack(&stk, 2 * StackGetTop(&stk) ); // (6)}else if( !strcmp(ops[i], "C") ) {StackPopStack(&stk); // (7)}else {StackPushStack(&stk, atoi(ops[i])); // (8)}}sum = 0;while(!StackIsEmpty(&stk)) { // (9) sum += StackGetTop(&stk);StackPopStack(&stk);}return sum;
}
- (1)(1)(1) 获取栈顶;
- (2)(2)(2) 先弹出,以便获取次栈顶;
- (3)(3)(3) 栈顶两个元素相加;
- (4)(4)(4) 将之前的栈顶元素放回去;
- (5)(5)(5) 更新本次得分;
- (6)(6)(6) 前一次得分的两倍;
- (7)(7)(7) 前一次得分无效,直接出栈;
- (8)(8)(8) 字符串转数字,偷懒了一下用系统 API 直接上了;
- (9)(9)(9) 最后将栈中元素都弹出来相加就是答案了。
三、本题小知识
栈 可以用来做表达式求值。