有效的括号--力扣经典面试题

目录

引言

题目描述:

思路分析:

代码展示:


引言

这道题是关于栈的经典面试题,如果大家对栈这个数据结构不是很了解的话,可以先看这篇博客--数据结构之栈的超详细讲解-CSDN博客

题目描述:

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

思路分析:

这是一道很经典的问题,他要求我们对括号进行匹配,这里用其他方法不是很好做,但时用栈这个结构的话,能很轻松的解决.

 这里我们写一个很复杂但是匹配的例子,比如[{()}]

我们用栈来存储所有的左括号,用栈顶元素与右括号进行匹配,这里巧妙使用了栈的后进先出的特性,栈顶元素即为最后一个左括号,与最开始的右括号进行匹配,最后当我们的字符数组没有元素时即为匹配成功.

代码展示:

因为这里需要使用栈这个数据结构,我们这里是使用C语言进行编写,没有C++STL容器可以直接使用,所以需要我们手动实现,大家如果还不会的,可以看数据结构之栈的超详细讲解-CSDN博客这篇博客,这里就不再另外进行讲解

代码如下:


//栈的结构
typedef char STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;//函数的声明
//初始化和销毁
void STInit(ST* pst);
void STDestory(ST* pst);
//入栈和出栈
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
//取栈顶元素
STDataType STTop(ST* pst);
//判空
bool STEmpty(ST* pst);
//获取数据个数
int STSize(ST* pst);//初始化和销毁
void STInit(ST* pst)
{assert(pst);pst->a = NULL;//top指向栈顶数据的下一个位置pst->top = 0;//top指向栈顶数据//pst->top = -1;pst->capacity = 0;
}
void STDestory(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}
//入栈和出栈
void STPush(ST* pst, STDataType x)
{assert(pst);//扩容if (pst->top == pst->capacity){int newcapcacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newcapcacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");return;}pst->a = tmp;pst->capacity = newcapcacity;}pst->a[pst->top] = x;pst->top++;
}
void STPop(ST* pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}
//取栈顶元素
STDataType STTop(ST* pst)
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}
//判空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}
//获取数据个数
int STSize(ST* pst)
{assert(pst);return pst->top;
}

 代码:


//栈的结构
typedef char STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;//函数的声明
//初始化和销毁
void STInit(ST* pst);
void STDestory(ST* pst);
//入栈和出栈
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
//取栈顶元素
STDataType STTop(ST* pst);
//判空
bool STEmpty(ST* pst);
//获取数据个数
int STSize(ST* pst);//初始化和销毁
void STInit(ST* pst)
{assert(pst);pst->a = NULL;//top指向栈顶数据的下一个位置pst->top = 0;//top指向栈顶数据//pst->top = -1;pst->capacity = 0;
}
void STDestory(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}
//入栈和出栈
void STPush(ST* pst, STDataType x)
{assert(pst);//扩容if (pst->top == pst->capacity){int newcapcacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newcapcacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");return;}pst->a = tmp;pst->capacity = newcapcacity;}pst->a[pst->top] = x;pst->top++;
}
void STPop(ST* pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}
//取栈顶元素
STDataType STTop(ST* pst)
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}
//判空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}
//获取数据个数
int STSize(ST* pst)
{assert(pst);return pst->top;
}bool isValid(char* s) {ST st;STInit(&st);while(*s){//左括号入栈if(*s == '(' || *s == '[' || *s == '{'){STPush(&st, *s);}//右括号取栈顶与左括号尝试匹配else{if(STEmpty(&st)){return false;}char top = STTop(&st);STPop(&st);//不匹配if(top == '(' && *s != ')'|| top == '{' && *s != '}'|| top == '[' && *s != ']'){STDestory(&st);return false;}}++s;}//如果栈不为空,说明左括号必右括号多bool ret = STEmpty(&st);STDestory(&st);return ret;
}

我们重点看后面这个函数,我们先定义栈这个结构,然后进行初始化,当字符数组中有元素时,就进行循环,如果这个字符等于左括号时,将它入栈,否则取栈顶元素与第一个不为左括号的元素进行匹配,如果不匹配直接返回false,注意: 此时返回false时,要销毁我们的栈空间,否则会造成空间浪费.如果匹配成功,字符往下移动,进入下一轮匹配.

注意:

这里最后一定要进行判空处理

力扣中有这样一个例子: S = "{",字符数组中只有一个左括号,我们循环将它入栈后,直接结束,循环过程没有匹配失败,但这并不代表它是匹配的,所以最后进行判空处理,并销毁栈空间.

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

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

相关文章

版本前瞻 | FASS2.2即将上线,6大亮点公布

自FASS上一版本发布已经过去了整整四个月。在这期间&#xff0c;FASS经历了很多重要项目的考验&#xff0c;也收到了用户很多宝贵的建议。经过几个月的开发和打磨完善&#xff0c;最新版本的FASS2.2终于要和大家见面了&#xff0c;针对存储系统配置使用复杂、运维监控粗放等痛点…

Unity初级---初识生命周期

1. Awake() &#xff1a;唤醒函数&#xff0c;最先执行的函数&#xff0c;只执行一次&#xff0c;当脚本文件挂载的对象被激活时调用 2. OnEnable() &#xff0c;OnDisable()&#xff1a;当脚本启用和禁用时触发&#xff0c;可执行多次&#xff0c;触发的前提是脚本挂载的对象…

多线程系列(七) -ThreadLocal 用法及内存泄露分析

一、简介 在 Java web 项目中&#xff0c;想必很多的同学对ThreadLocal这个类并不陌生&#xff0c;它最常用的应用场景就是用来做对象的跨层传递&#xff0c;避免多次传递&#xff0c;打破层次之间的约束。 比如下面这个HttpServletRequest参数传递的简单例子&#xff01; p…

PyQt 入门

Qt hello - 专注于Qt的技术分享平台 Python体系下GUI框架也多了去了&#xff0c;PyQt算是比较受欢迎的一个。如果对Qt框架熟悉&#xff0c;那掌握这套框架是很简单的。 一&#xff0c;安装 1.PyQt5 pip3 install PyQt5 2.Designer UI工具 pip3 install PyQt5-tools 3.UI…

【微磁学3D绘图工具探索】Excalibur

文章目录 概要调查报告技术名词解释主要特点 技术和算法实现他能够画出怎样酷炫的图 小结 概要 微磁学中的磁学结构同时包括二维和三维&#xff0c;想要绘制得好看&#xff0c;结果清晰&#xff0c;那么就需要一些自己写的绘图代码之外的额外渲染功能&#xff0c;尤其是对于三…

C语言写的LLM训练

特斯拉前 AI 总监、OpenAI 创始团队成员 Andrej Karpathy 用 C 代码完成了 GPT-2 大模型训练过程&#xff1a;karpathy/llm.c: LLM training in simple, raw C/CUDA (github.com) 下载源码 git clone --recursive https://github.com/karpathy/llm.c.git下载模型 从HF-Mirro…

springboot+vue+elementui实现校园互助平台大作业、毕业设计

目录 一、项目介绍 二、项目截图 管理后台 1.登录&#xff08;默认管理员账号密码均为&#xff1a;admin&#xff09; 2. 用户管理 ​编辑 3.任务管理 互助单&#xff08;学生发布&#xff09; 行政单&#xff08;教师发布&#xff09; ​编辑 审核&#xff08;退回需…

springboot 引入第三方bean

如何进行第三方bean的定义 参数进行自动装配

如何通过编程学习走科技特长生的路线?

编程是一门非常重要的技能&#xff0c;在当今数字化时代&#xff0c;掌握编程技能可以为个人的发展和就业提供更多机会。如果想要走科技特长生的路线&#xff0c;通过编程学习是一个非常好的选择。以下是一些步骤和建议&#xff0c;帮助你通过编程学习走科技特长生的路线&#…

rancher/elemental 构建不可变IOS(一)

一、什么是elemental Elemental 是 Rancher 的一个变种&#xff0c;专注于提供一个更轻量级的 Kubernetes 发行版。它旨在提供简化的部署和管理体验&#xff0c;同时保持 Kubernetes 的灵活性和强大功能。Elemental 通常针对较小的部署场景或资源受限的环境&#xff0c;例如测…

自建GitLab仓库

摘要 GitLab 是一个功能强大的开源代码托管平台&#xff0c;它不仅提供了代码存储和版本控制的核心功能&#xff0c;还集成了项目管理、CI/CD 流水线、代码审查等企业级特性。本文将指导你如何在自己的服务器上搭建 GitLab 社区版&#xff0c;创建一个完全属于自己的开源仓库&…

数据结构链表

数据结构链表 链表 1&#xff09;链表的概念及结构: 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 2&#xff09;实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 单向、双向…

# SSH 是什么?

SSH 是什么&#xff1f; 1、SSH 简介&#xff1a; SSH &#xff1a;全称 Secure Shell &#xff0c;它是安全外壳协议&#xff08;Secure Shell&#xff0c;简称SSH&#xff09;&#xff0c;是一种在不安全网络上用于安全远程登录和其他安全网络服务的协议。 SSH 由 IETF 的网…

信息系统项目管理师——项目工具

直方图散点图蒙特卡洛分析 PERT分析 因果图 控制图 帕累托图 持续改进 偏差分析 鱼骨图 工作绩效报告可以包含挣值图表和信息、趋势线和预测、储备燃尽图、缺陷直方图、合同绩效信息以及风险概述信息。可表现为仪表指示图、热点报告、信号灯图或其他形式。 干系人参与度评估矩…

服务器数据恢复—ESXi虚拟机中MySQL数据库数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌EVA某型号存储中部署VMware ESXi虚拟化平台&#xff0c;数据盘&#xff08;精简模式&#xff09;快照数据盘&#xff0c;虚拟机中有mysql数据库。 服务器故障&#xff1a; 机房意外断电导致该存储中的一台VMware虚拟机无法启动&#xff0…

C语言从头学01——入门程序

从这篇文章起&#xff0c;我将对以往自己学习C语言的笔记进行整理&#xff0c;并以专栏的形式与各位朋友一同再学习一下C语言。 开始&#xff0c;先介绍一个入门程序。这是一个学习任何计算机语言往往都以此开头的程序&#xff0c;这个程序的唯一作用是在屏幕上打印出“…

【iOS】方法交换(Method Swizzling)

文章目录 前言一、原理与注意用法注意要点Method Swizzing涉及的相关API 二、应用场景与实践1.统计VC加载次数并打印2.防止UI控件短时间多次激活事件3.防崩溃处理&#xff1a;数组越界问题4.防KVO崩溃 总结 前言 上文讲到了iOS的消息发送机制&#xff0c;在消息机制中我们了解…

【3dmax笔记】023:阵列工具(移动+一维+二维+三维)

文章目录 一、阵列工具二、案例演示 一、阵列工具 【阵列】命令将显示【阵列】对话框&#xff0c;使用该对话框可以基于当前选择创建对象阵列。 菜单栏&#xff1a;【工具】菜单 > 【阵列】 二、案例演示 首先&#xff0c;画一个物体&#xff0c;如茶壶&#xff0c;如下图…

【Web前端】CSS样式

1.CSS概念 1.1 使用意义 CSS(Cascading Style sheet):层香样式表CSS是一种语言&#xff0c;主要用来表现HTML样式的&#xff0c;可以修饰静态网页&#xff0c;也可以配合脚本语言对网页各元素进行美化处理CSS美化网页 1.2 特点 内容和表现相分离整站的所有网页表现形式统一&…

鸿蒙 DevEcoStudio:组件实例(页面及组件生命周期函数)

【使用onPageshow等生命周期函数】 在entry/src/main/ets/pages路径下创建Page1.ets: import router from ohos.router Entry Component struct Page1 {State message: string Hello WorldState show: booleantrueaboutToAppear(){console.log(Page1组件创建实例)}aboutToDisa…