⭐算法入门⭐《栈》简单04 —— LeetCode 682. 棒球比赛
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《栈》简单04 —— LeetCode 682. 棒球比赛相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?先看简单题! 🧡《C语言入门100例》🧡
数据结构难?不存在的! 🌳《画解数据结构》🌳
LeetCode 太简单?算法学起来! 🌌《夜深人静写算法》🌌
一、题目
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、原题链接
二、解题报告
1、思路分析
总共四种操作,分别模拟处理即可:
x
:字符串转换成整数后入栈;
+
:取 栈顶 和 次栈顶 元素相加后入栈;
D
:将栈顶元素乘 2 后入栈;
C
:出栈;
- 最后就是依次出栈,然后累加所有元素的和了。
- 有关 栈 的实现,可以参见以下文章:《画解数据结构》栈。
2、时间复杂度
- 由于每个括号最多入栈一次,出栈一次。
- 所以时间复杂度: O ( n ) O(n) O(n)
3、代码详解
/************************************* 栈的顺序表实现 *************************************/
#define DataType int
#define maxn 100010
struct 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) 最后将栈中元素都弹出来相加就是答案了。
三、本题小知识
栈 可以用来做表达式求值。
以上是关于⭐算法入门⭐《栈》简单04 —— LeetCode 682. 棒球比赛的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《栈 和 队列》简单01 —— LeetCode 232. 用栈实现队列
⭐算法入门⭐《栈 和 队列》简单02 —— LeetCode 225. 用队列实现栈
⭐算法入门⭐《栈 和 队列》简单02 —— LeetCode 225. 用队列实现栈
⭐算法入门⭐《栈》简单01 —— LeetCode 20. 有效的括号