Leetcode-有效的括号(带图)

news2025/1/18 20:12:54

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/1682403.html

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

相关文章

git 拉取指定目录

指令方式 打开 git 自带的Git Bash 工具 以拉取github中 fastjson 的 /src/test/java/oracle/sql/ 目录为例 1.创建文件夹和git 初始化 cd D:/Program\ Files mkdir fastjson cd fastjson git init 2.设置允许克隆子目录 git config core.sparsecheckout true 3.添加远程…

【physx/wasm】在physx中添加自定义接口并重新编译wasm

目录 说在前面环境搭建编译自定义接口 说在前面 操作系统&#xff1a;windows11wsl2physx版本&#xff1a;5.3.1参考&#xff1a;physx-js-webidl (physx版本为该作者fork出的某个版本) 环境搭建 这里使用的是wsl2docker进行编译的&#xff0c;搭建步骤参考&#xff1a;WSL2 上…

深入探索Jetpack Compose:大前端式客户端开发实战

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

win10编译openssl

环境 Win10 64位 VS2022 openssl 3.3.0 nasm NASM version 2.16.01 compiled on Dec 21 2022 perl strawberry-5.38.2.2环境变量设置 perl加入到环境变量&#xff0c;略过nasm加入到环境变量vs的nmake加入到环境变量我的nmake位置如下&#xff1a; C:\Program…

【Unity Shader入门精要 第7章】基础纹理(二)

除了用于直接表示物体表面颜色&#xff0c;纹理的另外一种常见用法是用来进行凹凸映射&#xff0c;在不增加顶点的情况下&#xff0c;通过纹理来提供额外的法线信息&#xff0c;从而在视觉上增加表面凹凸细节&#xff0c;丰富渲染表现。 最常用的两种凹凸映射为法线贴图和高度…

【C语言每日题解】用函数来模拟实现strlen()、strcpy()、strcmp()、strcat()

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ 学习了函数后&#xff0c;老师让我们用函数来实现上面这四个字符串函数。 我们首先来了解一下这四个字符串函数&#xff1a; 1.strlen函数 用于获取字符串长度&#xff08;不包括末尾…

用Rust构造一个人员基本信息的实体类,输出json测试结果

目录 一、需求说明 二、知识点 serde 一、需求说明 需求描述&#xff1a;用Rust写一个人员基本信息的实体类, 包括编号、姓名、描述、性别、备注、照片、简历等&#xff0c;加上3条测试数据&#xff0c;输出为json。 cargo add serde serde { version "1.0.201"…

SVN切换账号

SVN切换账号 有这么一种情况&#xff0c;对于一个新项目&#xff0c;项目紧急的情况下&#xff0c;大家会使用一个svn账号下载代码&#xff0c;开始提前熟悉业务。那么当正式开发的时候&#xff0c;每个人的svn账号也已经下发下来了&#xff0c;这个时候大家就需要切换成自己的…

Jquery+Servlet+JDBC实现登录注册功能

前端部分 HTMLCSS部分 引入JQuery包和JQuery.cookie包&#xff0c;前者封装了DOM操作的一些方法&#xff0c;后者封装了对cookie的操作 我们使用cookie主要是为了做登录后页面的跳转时&#xff0c;能存下来这个用户是谁&#xff0c;这样后面可以对单一用户进行操作&#xff…

嵌入式学习-PWM输出比较

简介 PWM技术 输出比较框图介绍 定时器部分 比较器控制部分 输出控制部分 相关寄存器

使用screen窗口在Autodl服务器训练网络

无法使用鼠标滚轮来查看历史输出的消息 vim ~/.screenrc 按i插入 termcapinfo xterm* ti:te 按esc :wq 保存screen创建的会话中&#xff0c;无法使用鼠标滚轮来查看历史输出的消息 解决方法_screen查看历史输出-CSDN博客无法使用鼠标滚轮查看screen会话历史&#xff0c;解决方…

证件照尺寸标准大小及用途介绍

在日常生活中&#xff0c;证件照是我们不可或缺的一部分&#xff0c;无论是办理身份证、驾驶证&#xff0c;还是参加考试、求职&#xff0c;都需要用到不同尺寸和底色的证件照。本文将为您详细介绍证件照的尺寸标准、用途以及底色的选择。 一、证件照的尺寸标准证件照的尺寸通…

【错题集-编程题】小红的ABC(字符串 + 找规律)

牛客对应题目链接&#xff1a;小红的ABC (nowcoder.com) 一、分析题目 算法思路&#xff1a;由于题目要找的是最短的回文子串&#xff0c;并且只有三个字母&#xff1a;a、b、c&#xff0c;因此最短的回文子串的长度要么是 2&#xff0c;要么是 3。因此&#xff0c;我们仅需枚举…

如何重启Windows系统上的Mysql服务

很久很久之前&#xff0c;我想把我的一台windows笔记本当比服务使用&#xff0c;当时还没有搞wsl, 试了vmware在局域网内总是断连。然后就直接在 windows系统上装了一个 windows版本的Mysql81。 有一天需要修改最大连接数&#xff0c; 费了挺大的劲终于找到了配置文件 my.ini…

“碳”索不止

2023年&#xff0c;欧盟宣布将在未来实施CBAM&#xff08;碳边境调节机制&#xff09;&#xff0c;也称为碳关税&#xff0c;是一种针对进口货物的碳排放定价政策工具。该机制要求在欧盟境内的进口商对其进口产品支付相应的碳排放费用&#xff0c;以弥补其生产过程中产生的碳排…

K8S认证 | CKA题库 + 答案 | 查看Pod CPU资源使用量

2、查看集群中运行Pod CPU资源使用量 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s …

6.概率论

概率论在深度学习中也有着广泛的应用。由于深度学习模型通常包含大量的参数和复杂的结构&#xff0c;因此在实际应用中很难直接找到最优解。此时&#xff0c;我们可以利用概率论中的相关概念和方法&#xff0c;如贝叶斯推断、最大似然估计等&#xff0c;来估计模型的参数或评估…

【环境监测与分析】-环境检测过程案例

一.方案背景 空气质量检测&#xff0c;是指对空气质量的好坏进行检测。空气质量的好坏反映了空气中污染物浓度的高低。空气污染是一个复杂的现象&#xff0c;在特定时间和地点空气污染物浓度受到许多因素影响。来自固定和流动污染源的人为污染物排放大小是影响空气质量的最主要…

win11安装SQL Server 2012 企业版

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、硬件要求二、软件安装问题参考&#…

国外站群服务器如何提高seo排名

很多seo网站优化会选择国外站群服务器&#xff0c;那么国外站群服务器如何提高seo排名&#xff0c;具体方式有哪些?Rak部落小编为您整理发布国外站群服务器如何提高seo排名。 国外站群服务器可以通过以下几种方式提高网站在搜索引擎中的排名&#xff1a; - **内容分发与加速**…