Leetcode-有效的括号

20. 有效的括号 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/valid-parentheses/

题目

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

图解

代码(思路都在代码中)

typedef char STDataType;
// 栈的结构
typedef struct Stack {
    STDataType* a; // 指针
    int top;       // 栈顶
    int capacity;  // 容量
} Stack;
// 扩容函数
void Exp(Stack* p) {
    if (p->capacity == p->top) {
        // 利用三目运算来判断是否
        int New_cap = p->capacity == 0 ? 4 : p->capacity * 2;
        STDataType* tmp =
            (STDataType*)realloc(p->a, New_cap * sizeof(STDataType));
        if (tmp == NULL) {
            assert("realloc");
            return;
        }
        // 将开辟空间给给原来的变量
        p->a = tmp;
        p->capacity = New_cap;
    }
}

// 初始化
void StackInit(Stack* p) {
    assert(p);
    p->a = NULL;
    p->capacity = p->top = 0;
}
// 入栈
void StackPush(Stack* p, STDataType data) {
    assert(p);
    // 判断空间
    Exp(p);
    // 入栈
    p->a[p->top] = data;
    // 入栈后栈顶向上移动
    p->top++;
}
// 出栈
void StackPop(Stack* p) {
    assert(p);
    assert(p->top > 0); // 确保不为空

    // 判断是否元素是否为0,避免越界
    /*if (p->top == 0)
    {
        return;
    }*/
    p->top--;
}
// 获取栈顶元素
STDataType StackTop(Stack* p) {
    // 判断是否为0
    if (p->top == 0) {
        return (STDataType)0; // 由于返回类型是 STDataType,所以需要强制转换
    }
    return p->a[p->top - 1];
}
// 获取栈中有效元素个数
int StackSize(Stack* p) { return p->top; }
// 判空
bool StackEmpty(Stack* p) {
    // 使用逻辑非操作符(!)来检查栈顶指针(top)是否为0(即栈是否为空)
    // 如果top为0,说明栈中没有任何元素,因此栈是空的
    // 在C语言中,逻辑非操作符会将0转换为1(true),非0转换为0(false)
    // 所以当栈顶指针top为0时,!p->top的结果为true(非零值),表示栈为空
    // 反之,如果栈中有元素(top非0),则!p->top的结果为false(0),表示栈非空
    return !p->top;
}
// 销毁栈
void StackDestroy(Stack* p) {
    if (p->a) {
        free(p->a);
        p->a = NULL;
        p->capacity = p->top = 0;
    }
}
bool isValid(char* s) {
    // 思路:我们利用栈来解决这个问题,利用进先出的特性
    // 创建栈
    Stack s1;
    // 初始化栈
    StackInit(&s1);
    // 利用循环来遍历字符
    while (*s) {
        // 让左括号入栈
        if (*s == '(' || *s == '{' || *s == '[' ) {
            StackPush(&s1, *s);
        } else { // 右括号取栈顶的左括号匹配

            // 首先我们判断是否为空
            if (StackEmpty(&s1)) { // 这里说明栈我为空(也就是说左括号没有和右括号对应或者说就只有一个右括号)
                StackDestroy(&s1); // 直接释放栈
                return false;
            }
            // 获取栈顶元素(这里就有了后进先出的原理了)
            STDataType top = StackTop(&s1);
            // 获取后出栈,方便下一次入栈
            StackPop(&s1);
            // 判断是否对应(这边判断的条件是不相等,这样就可以排除所有可能false)

     if ((top == '{' && *s != '}')||(top == '[' && *s != ']')||(top == '(' && *s != ')'))
            // 也就是说:栈里面的左括号&&字符中不等于和他对应的右括号
             {
                return false;
                StackDestroy(&s1);
            }
        }
        ++s; // 每次遍历向后移动
    }
    // 循环跳出就意味着排除了这些可能,但是这边我们不排除只有一个左括号或者右括号或者左括号比右括号多,所以需要判空
    bool ret = StackEmpty(&s1);
    StackDestroy(&s1); // 这边我们需要释放一下,避免空间泄露
    return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/620160.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySql软件安装

1.打开mysql官网网址 MySQL :: Download MySQL Community Server 2.本次针对版本8的图形化界面安装&#xff0c;下载成功后接下来对MySQL进行安装 3.图形化下载后有一个MSI文件 4.我们安装典型即可&#xff0c;选择第一个 5.选择数据库信息存放的路径&#xff0c;我默认放在C盘…

Redis继续(黑马)

Redis持久化 RDB与AOF RDB记录是二进制数据&#xff0c;Redis停机时会触发保存&#xff0c;名称&#xff1a; dump.rdb 缺点&#xff1a;间歇式复制可能存在宕机数据更新丢失 AOF 记录的写操作命令&#xff0c;每秒记录一下&#xff0c;也存在数据更新丢失的可能&#xff0c;相…

【数轮】数论、质数、最大公约数、菲蜀定理

数学 唯一分解定理 n>2都可以表示为质因数的乘方。 令 n a1b1a2b2 … \dots … a1,b1 … \dots …都是质因数&#xff0c;b1,b2 … \dots …是对应质因数的数量。 调和级数 11/2 1/3 1/4 ⋯ \cdots ⋯ 1/ n 约等于 logn。 证明过程&#xff1a; 1/3 1/4 < (1/2) …

idea已配置的git仓库地址 更换新的Git仓库地址 教程

文章目录 目录 文章目录 更改流程 小结 概要更改流程技术细节小结 概要 先在idea控制台走一下流程 先将本地的git仓库删除 1. 查看当前远程仓库地址&#xff1a; 在终端或命令行中&#xff0c;导航到你的项目目录&#xff0c;并运行以下命令查看当前的远程仓库地址&#xff…

CTF之love_math

这个题目简单看一下就知道要传参进行执行系统命令以达到找到flag的目的。 但是又可以发现过滤了很多东西。 这个题的绕过方法可以用到三个函数 base_convert(number,froombase,tobase)//分别为原始值&#xff0c;原来进制&#xff0c;要转换的进制dechex("十进制数"…

气膜建筑电源配置是怎样的—轻空间

在气膜建筑中&#xff0c;电源配置是确保建筑控制系统连续运行的重要组成部分。以下是该建筑的电源配置方案&#xff1a; 1. 市电供电与备用发电机&#xff1a; 为了应对市电中断等突发情况&#xff0c;系统采用市电供电与备用柴油发电机双重供电方式。这种配置保证了即使在市电…

JDK APT(Annotation Processing Tool) 编译时注解处理器

博文目录 文章目录 javacAnnotation ProcessingHow Annotation Processing WorksCompilation Environment and Runtime Environment maven-compile-plugin对 Maven pom 中配置注解处理器的理解Lombok, MapStruct, MyBatis-Flex 说明测试只在 dependencies 中配置 Lombok 和 Ma…

【网络安全】适合新手的CTF靶场合集(非常详细)零基础入门到精通,收藏这一篇就够了

前言 经常会有粉丝朋友询问大白&#xff0c;如何打CTF比赛&#xff0c;有没有适合新手的CTF靶场&#xff1f; 今天呢大白就给粉丝朋友分享一下&#xff0c;我整理得可能没有那么全&#xff0c;这里的合集主要还是面对新手。做题贵精不在多&#xff0c;好好练习每一题&#xf…

STM32 PWM 计数器模式和对齐

STM32 PWM 计数器模式和对齐 1. TIM高级定时器简介2. TIM计数模式2.1 向上计数2.2 向下计数2.3 中心对齐模式&#xff08;向上/向下计数&#xff09;2.4 重复计数 3. PWM输出模式3.1 举例看下PWM中心对齐模式&#xff0c;设置参数如下&#xff1a; 4. FOC中PWM相关设置说明4.1 …

其他的 框架安全:Apache Shiro 漏洞序列.(CVE-2016-2807)

什么是 Apache Shiro Apache Shiro 是一个强大且易用的Java安全框架&#xff0c;它为应用程序提供了身份验证、授权、加密和会话管理等常见的安全功能。漏洞大多会发生在登录处&#xff0c;返回包里包含remeberMedeleteMe字段.&#xff08; Shiro 这个属于第三方的&#xff0c…

Linux线程(三)死锁与线程同步

目录 一、什么是死锁 死锁的四个必要条件 如何避免死锁 避免死锁算法 二、Linux线程同步 三 、条件变量 1、条件变量基本原理 2、条件变量的使用 3、条件变量使用示例 为什么 pthread_cond_wait 需要互斥量? 一、什么是死锁 死锁是计算机科学中的一个概念&#xff0c;…

Qt---绘图和绘图设备

一、QPainter绘图 绘图事件 void paintEvent() 声明一个画家对象&#xff0c;OPainter painter(this) this指定绘图设备 画线、画圆、画矩形、画文字 设置画笔QPen 设置画笔宽度、风格 设置画刷QBrush 设置画刷风格 代码示例&#xff1a; #includ…

买一手股指期货跌多少会爆仓?

当指数下跌导致持有的股指期货合约价值减少&#xff0c;而你的保证金账户中的资金不足以维持原有的保证金要求时&#xff0c;期货公司会要求你追加保证金&#xff0c;即所谓的“追加保证金通知”。如果投资者无法及时补足保证金&#xff0c;期货公司则有权强制平仓&#xff0c;…

【Linux】磁盘文件

思维导图 学习目标 了解磁盘的物理结构和存储结构&#xff0c;并将其存储结构进行抽象&#xff01;&#xff01; 一、了解一下磁盘及其物理结构 1.1 计算机只认识二进制 什么是二进制&#xff1f;&#xff1f;0&#xff0c;1是被规定出来的&#xff0c;在计算机里面我们用高低…

SAP 控制已转采购订单的PR不允许删除简介

SAP系统中采购申请当被转成采购订单后&#xff0c;在采购申请中会关联到对应已生生成的采购订单&#xff0c;如下图中可以看到采购申请对应的采购订单 当日常操作中用户在创建完采购申请后&#xff0c;当PR转成PO后仍然可以将采购申请的行项目进行删除&#xff0c;显然这个操作…

『拼多多、淘宝、抖音、小红书等卖家』4个有效动作,走出成单低谷期

对于拼多多、淘宝、抖音、小红书等平台的卖家来说&#xff0c;走出成单低谷期需要一系列有效的动作。以下是店雷达四个建议&#xff1a; 一、选品优化 1、深入市场研究&#xff1a;了解当前市场趋势、消费者需求和潜在的市场空白。使用各种工具&#xff0c;如店雷达选品功能&…

Python深度学习基于Tensorflow(2)Tensorflow基础

文章目录 基本操作数据转换和数据生成操作形状数据提取和保存变量Numpy和Tensorflow的比较 计算图静态图动态图自动图 自动微分使用Tensorflow 实现回归 首先是Tensorflow的安装&#xff0c;由于可能会出现版本冲突&#xff0c;最好在conda环境安装&#xff0c;同时&#xff0c…

华为OD机试 - 密码输入检测(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

leetcode经典例题之环形队列

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、题目展示2、问题分析3、完整代码展示4、结语 1、题目展示 在拿到题目时&#xff0c;通…

前端动态旋转地球背景

效果图 贴下源码 <template><div class"map-bg"><div class"canvas" id"canvs"></div><canvas class"canvasxk" id"canv"></canvas></div> </template><script setup …