⭐算法入门⭐《栈》简单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、原题链接

LeetCode 682. 棒球比赛

二、解题报告

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. 有效的括号

⭐算法入门⭐《栈》简单02 —— LeetCode 234. 回文链表

⭐算法入门⭐《栈》简单03 —— LeetCode 844. 比较含退格的字符串