《六月集训》第十四日——栈

前言

这是六月集训的第十四日,今日的训练内容是

解题报告

1.力扣剑指 Offer 31. 栈的压入、弹出序列

原题链接

剑指 Offer 31. 栈的压入、弹出序列

题目概述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

解题思路

定义一个辅助的栈用于按照题目的要求进行压栈,然后每当 popped 数组的元素与栈顶元素相等的时候,就出栈,并且移动指向 popped 数组的指针,如果最后压栈全部都结束了仍然有没有出栈的元素在,那么就说明不能满足条件,因此只需要看栈顶指针是否为 0 即可。
值得注意的一点是:在内部的 while() 循环的判断条件处,一定要把 top 写在前面,这样当 top0 时直接就不会进行后面的判断,也就可以避免了数组下标越界的问题了。

源码剖析

bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
    int* stack = (int *) malloc (sizeof(int) * pushedSize);     //定义一个辅助栈
    int top = 0, i = 0, j = 0;
    while(i < pushedSize) {       
        stack[top++] = pushed[i++];
        while(top&&popped[j]==stack[top-1]){
            ++j;
            --top;
        }                             
    }
    return !top;
}

2.力扣946

原题链接

946. 验证栈序列

题目概述

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

解题思路

和上一题一模一样,直接复用一下就可以了。

源码剖析

bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
   int* stack = (int *) malloc (sizeof(int) * pushedSize);     //定义一个辅助栈
    int top = 0, i = 0, j = 0;
    while(i < pushedSize) {       
        stack[top++] = pushed[i++];
        while(top&&popped[j]==stack[top-1]){
            ++j;
            --top;
        }                             
    }
    return !top;
}

3.力扣856

原题链接

856. 括号的分数

题目概述

给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:

  • () 得 1 分。
  • AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
  • (A) 得 2 * A 分,其中 A 是平衡括号字符串。

解题思路

这题还是直接使用递归做比较方便,遇到右括号时就等于 1 假如已经有 1 了就乘 2 ,每次碰到左括号就直接新加一层递归。

源码剖析

int GetScore(char **S)
{
    int score = 0;
    while (**S != '\0') {
        if (**S == '(') {
            *S += 1;
            score += GetScore(S);
        } else {
            *S += 1;
            score *= 2;
            return (score == 0) ? 1 : score;
        }
    }
    return score;
}
int scoreOfParentheses(char *S)
{
    return GetScore(&S);
}

4.力扣1190

原题链接

1190. 反转每对括号间的子串

解题思路

记录一下明日写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值