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) {// 判断是否为0if (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.hqwc.cn/news/707426.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echart柱状图的第一个柱子超出了y轴

解决 boundaryGap 此属性与坐标轴两端空白有关。默认值为true即留空&#xff0c;false则表示柱子顶头,而出现上述现象,是因为代码中参数 boundaryGap设置为了false 将boundaryGap的值改为true或者去掉那行代码不使用该参数即可 xAxis: {type: category,boundaryGap: true,// …

JUnit5嵌套测试

什么是嵌套测试&#xff1a; 测试用例体现业务的层级 Nested使用场景&#xff1a; 定制化执行用例用列层级、业务关系更加清晰 在不使用Nested注解时&#xff0c;其在执行时不能体现逻辑关系&#xff0c;导致很难判断 而使用Nested注解&#xff0c;需要结合class使用&#…

[OpenGL] 点光源阴影(万向阴影贴图)

本章节源码 点击此处 文档持续更新 一 为什么采用点透视投影 透视投影: 由于点光源是一个点向四周发散的光线,所以这将导致点光源会以不同的角度到达场景中的不同表面&#xff0c;造成近大远小的效果,所以要采用透视投影矩阵来处理点光源的阴影,透视投影能够正确反映这种随着…

visual studio snippet常用注释片段

Visual Studio 2022 添加自定义代码片段_vs2022 代码片段-CSDN博客 dclass.snippet: <?xml version"1.0" encoding"utf-8"?> <CodeSnippets xmlns"http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> …

刚学完PMP好找工作吗?

如果你有项目管理相关工作经验&#xff0c;持有PMP证书会增加找工作的机会。许多企业在招聘项目经理和项目管理相关岗位时&#xff0c;通常要求具备PMP证书&#xff0c;或者PMP持有者优先考虑。 PMP证书是项目管理领域的专业认证&#xff0c;在多个行业都有广泛应用。如果你已…

24上软考高项最后一周冲刺攻略+答题技巧,赶紧收藏!!

距离软考考试的时间越来越近了&#xff0c;趁着这一周赶紧准备起来。 今天给大家整理了——信息系统项目管理师冲刺资料 &#xff0c;都是核心重点&#xff0c;有PDF&#xff0c;打印出来直接背。 一、考试科目&#xff1a; 科目一&#xff1a;综合知识 【总分&#xff1a;75分…

不能输的战争:谷歌的Veo能否成功阻击OpenAI的Sora?|TodayAI

在2024年谷歌I/O大会上&#xff0c;谷歌宣布推出Veo&#xff0c;这是一款能够根据文本、图像或视频提示生成高清视频的AI视频合成模型。Veo具有生成1080p分辨率、时长超过一分钟的视频的能力&#xff0c;并能根据书面指令编辑视频&#xff0c;但目前尚未向公众广泛发布。 据介…

QT项目实战:贪吃蛇小游戏

目录 内容介绍 一.添加头文件 二.初始化蛇与奖品 三.设置背景图&#xff0c;蛇与奖品 1.设置背景图 2.画蛇 3.画奖品 四.小蛇移动 1.控制方向 2.向上移动 3.向下移动 4.向右移动 5.向左移动 五.随机生成奖品位置 六.是否吃到奖品 七.删除操作 八.游戏结束 九…

Android:基于Gradle 7.0+(8.2、8.6)发布aar到maven仓库,使用maven-publish插件

maven插件与maven-publish插件的区别 maven插件适用于gradle1.0-6.2版本&#xff0c;6.2版本后该插件就被废弃了&#xff0c;推荐使用maven-publish插件。 maven-publis插件是在gradle 1.3 版本后开始支持的&#xff0c;使配置更加简洁。 maven-publis插件的使用 砍柴不误磨…

数据结构:二叉树的序列化和反序列化(序列和二叉树结构一一对应)

文章目录 一、基础知识1.1 序列化和反序列基础知识1.2 string与int转化STL函数 二、详解说明2.1 基于前序遍历的序列化和反序列化2.2 基于后序遍历的序列化和反序列化2.3 基于层序遍历的序列化和反序列化 三、例题——652. 寻找重复的子树 三个相同题目&#xff1a; 297. 二叉树…

Pencils Protocol Season 2 收官在即,Season 3 携系列重磅权益来袭

此前Scroll生态LaunchPad &聚合收益平台Pencils Protocol&#xff08;原Penpad&#xff09;&#xff0c;推出了首个资产即其生态代币PDD的Launch&#xff0c;Season 2活动主要是用户通过质押ETH代币、组件战队等方式&#xff0c;来获得Point奖励&#xff0c;并以该Point为依…

C++那些事之Mixin惯用法

C那些事之Mixin惯用法 大家好&#xff0c;我是光城&#xff0c;今天给大家分享C那些事里面的一个惯用法&#xff1a;mixin 混合&#xff08;Mixins&#xff09;是Lisp中的一个概念。混合是类的一部分&#xff0c;意味着它旨在与其他类或混合组合在一起。常规独立类&#xff08;…