Leetcode-有效的括号

news2025/2/24 3:12:50

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

毕业论文降重方法有哪些?aigc检测率怎样降下去?不墨迹!

快速论文降重方法有哪些&#xff1f;aigc检测率怎样降下去&#xff1f;网上有各种方法&#xff0c;但是都太墨迹。本身毕业论文对于很多同学来说就是第一次写&#xff0c;论文查重降重也是第一次经历&#xff0c;那些高超的技巧很难掌握住&#xff0c;而且很多同学的重复率又太…

ctfshow 源码审计 web301--web305

web301 在checklogin.php 发现了 $sql"select sds_password from sds_user where sds_username".$username." order by id limit 1;";在联合查询并不存在的数据时&#xff0c;联合查询就会构造一个虚拟的数据就相当于构造了一个虚拟账户&#xff0c;可以…

【2024年5月备考新增】】 考前篇(1)《官方平台 - 考生模拟练习平台操作指南》

1 登录 登录中国计算机技术职业资格网(https://www.ruankao.org.cn),点击服务园地的【模拟练习】。 温馨提示:实名认证通过且注册成功的考生方可登录模拟练习。 2 下载模拟作答系统 温馨提示: 点击“下载”按钮,下载对应的模拟作答系统。未报名成功的考生不允许下载…

element table 合并单元格(:span-method)

element table 需要最后一列单元格进行单一到左 需要一个地方对整个表格做操作&#xff0c;没有UI设计&#xff0c;需要自行脑补设计 把最后一列全部合并&#xff0c;做成一列输出就好&#xff1b; 效果 核心代码 视图 <el-table :data"loseDataList" style&quo…

​​​【收录 Hello 算法】5.3 双向队列

目录 5.3 双向队列 5.3.1 双向队列常用操作 5.3.2 双向队列实现 1. 基于双向链表的实现 2. 基于数组的实现 5.3.3 双向队列应用 5.3 双向队列 在队列中&#xff0c;我们仅能删除头部元素或在尾部添加元素。如图 5-7 所示&#xff0c;双向队列&#xff08…

阿贝云免费虚拟主机和免费云服务器评测

阿贝云是一家知名的云服务提供商&#xff0c;提供免费虚拟主机和免费云服务器服务。他们的服务质量一直备受好评&#xff0c;受到了广大用户的青睐。使用阿贝云的免费虚拟主机和免费云服务器&#xff0c;用户可以轻松地搭建自己的网站和应用&#xff0c;享受稳定的服务和优质的…

二分图及图匹配(图论学习总结部分内容)

文章目录 前言四、二分图及图匹配二分图常见模型二分图例题 e g 1 : eg1: eg1: [ Z J O I 2009 ZJOI2009 ZJOI2009​\][假期的宿舍](https://ac.nowcoder.com/acm/contest/34649/B)(二分图最大匹配板题) e g 2 : eg2: eg2:​​ [C-Going Home](https://ac.nowcoder.com/acm/con…

《深入浅出LLM基础篇》(四):主流大模型分类介绍

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…

Mysql数据存储格式分析

一、整体存储逻辑 1.1 Mysql数据存放位置 不同的存储引擎&#xff0c;对Mysql数据的存储是不同的。新建一个test数据库&#xff0c;里面有t1,t2和test5三张表&#xff0c;以Innodb和Myisam存储引擎为例&#xff1a; Innodb存储引擎&#xff1a; .frm文件&#xff1a;与表相…

如何查看MySQL binlog日志

1、查看MySQL是否开启binlog日志 SQL&#xff1a;show variables like ‘%log_bin%’; log_bin:on 是开启状态 若是OFF&#xff0c;则需要开启binlog日志。 开启方式&#xff1a;打开mysql配置文件my.cnf&#xff0c;在[mysqlId]下面增加 log-binmysql-bin 查看binlog日志 …

【客户案例】禅道软件助力长虹新网实现研发项目管理创新

四川长虹新网科技有限责任公司&#xff08;以下简称长虹新网&#xff09;深耕全球运营商市场二十多年&#xff0c;具备行业领先的软硬件研发、制造、全球化市场营销能力&#xff0c;持续服务国内外200多家主流电信及广电运营商、垂直行业服务商&#xff0c;与合作伙伴共同成长。…

快团团怎么做帮卖团长/供货大团长(如何从小白到优质团长)?

一名小白想要成长为快团团的优质团长&#xff0c;可以遵循以下步骤和策略&#xff1a; 了解平台与注册成为团长&#xff1a; 首先&#xff0c;熟悉快团团平台的操作流程和规则。快团团是一个基于微信的小程序&#xff0c;专注于社区团购业务。通过微信扫描团长资源二维码或在快…

NodeJS编写后端接口

技术栈 1.express&#xff1a;Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建 各种 Web 应用&#xff0c;和丰富的 HTTP 工具&#xff0c;使用 Express 可以快速地搭建一个完整功能的网站。 2.mysql&#xff1a;用于操作MySQL数据库 3.bod…

pytorch常用内置loss函数与正则化技术(补充小细节)

文章目录 前言一、常用损失函数(后面用到了新的会一一补充)1.1 回归中的损失函数1.1.1 nn.MSELoss()示例1:向量-向量示例2:矩阵--矩阵(维度必须一致才行)1.2 分类中的损失函数1.2.1 二分类(1)nn.BCELoss --- 二分类交叉熵损失函数示例1:向量-向量示例2:矩阵--矩阵(维…

618买什么划算?618买啥好?618数码好物推荐,必买清单大放送!

随着一年一度的618购物狂欢节的临近&#xff0c;作为数码领域的资深爱好者&#xff0c;我感到有责任为大家推荐精心挑选的数码精品。无论你是追逐科技尖端的探索者&#xff0c;还是希望通过智能装备提升生活品质的时尚人士&#xff0c;这里的每一款产品都能与你的心灵产生共鸣。…

基于PHP开发的图片高清无损在线压缩源码系统 带完整源代码以及搭建教程

系统概述 高清无损在线压缩源码系统基于PHP语言开发&#xff0c;结合GD库和ImageMagick等图像处理工具&#xff0c;实现了对JPEG、PNG、GIF等多种图片格式的高清无损压缩。系统采用B/S架构&#xff0c;用户只需通过浏览器访问系统界面&#xff0c;即可实现图片的上传、压缩、预…

【小白入门篇6】常识|怎么计算模型需要的资源

01 背景 各个公司相继推出大模型, 有开源和不开源,有些技术爱好者也开始心痒难耐&#xff0c;萌生了私有本地模型,甚至有伙伴构建大模型并进行训练的想法, 大模型不仅比拼技术, 也是比拼爹(资源)的存在, 我个人在实战经历经常问自己,到底需要什么样配置才能跑起来这个模型, 完…

玩转cpp小项目星球3周年了!

公众号原创文章破600&#xff01;玩转cpp小项目星球目前已运营3年&#xff0c;平时不怎么宣传&#xff0c;借此机会给大家分享一下这三年里面我沉淀了哪些内容。里面包含&#xff1a; 1.小项目&#xff1a;一些核心模块的拆解&#xff0c;例如&#xff1a;grpc、mutex、线程池等…

python数据分析——数据分类汇总与统计

数据分类汇总与统计 前言一、Groupby分类统计语法按列分组示例一示例二示例三 遍历各分组示例 使用字典和Series分组示例 使用函数分组示例 二、数据聚合groupby的聚合函数示例一示例二 逐列及多函数应用示例一示例二 返回不含行索引的聚合数据示例 三、一般性的“拆分-应用-合…

程序员日志之星际争霸

目录 传送门正文日志1、概要2、星际争霸编年史2.1、最早版本 Alpha2.2、早期版本 Early Beta2.3、测试版 Beta2.4、正式版 StarCraft2.5、母巢之战测试版 BroodWar Beta2.6、星际争霸-母巢之战 BroodWar2.7、地图编辑器&#xff08;1.07及以上&#xff09; StarEdit2.8、《星际…