【栈与队列面试题】有效的括号(动图演示)
leetcode20.括号匹配问题
前言:
💥🎈个人主页:Dream_Chaser~ 🎈💥
✨✨刷题专栏:http://t.csdn.cn/UlvTc
⛳⛳本篇内容:力扣上栈与队列的面试OJ题目
目录
leetcode20.括号匹配问题
1.问题描述
2.前提准备
3.问题题解
1.问题描述
给定一个只包括
'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。

2.前提准备
栈的实现
#pragma once
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#include<stdio.h>
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;//栈顶的位置int capacity;//栈的容量
}ST;void STInit(ST* pst);
void STDestroy(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;//指向栈顶元素的下一个位置pst->capacity = 0;}
void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;
}void STPush(ST* pst,STDataType x)
{if (pst->top == pst->capacity){int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;//返回的是realloc出来的内存块的地址pst->capacity = newCapacity;//把扩容后的空间大小赋值给栈容量}pst->a[pst->top] = x;//先放值pst->top++;//再++
}void STPop(ST* pst)
{assert(pst);assert(!STEmpty(pst));pst->top--;
}STDataType STTop(ST* pst)
{assert(pst);assert(!STEmpty(pst));return pst->a[pst->top - 1];
}bool STEmpty(ST* pst)//栈为空返回true,不为空返回false
{//assert(pst);//if (pst->top == 0)//{// return true;//}//else//{// return false;//}return pst->top == 0;
}int STSize(ST* pst)
{assert(pst);return pst->top;
}
3.问题题解
s指向的是右括号,top存储的是左括号,st(栈顶指针),a(栈底指针)
- 只要有一次不对应的情况,那么程序直接返回false
- 字符串遍历结束,若栈不为空,直接返回false
- 在比较过程中,若遇到栈为空,可是此时字符串未遍历完,直接返回false
第一种情况:左括号多余

第二种情况:括号没有多余,但是类型匹配不上

第三种情况:右括号多余

代码实现:
bool isValid(char * s){ST st;STInit(&st);while(*s)//*s就是输入的那个x的值{//1.左括号入栈if(*s == '(' || *s == '[' || *s == '{'){STPush(&st, *s); }else{if(STEmpty(&st))//栈为空也需要销毁,因为它malloc了空间,空间在那占用着,只是数据没填进去{STDestroy(&st);return false;}//右括号出栈匹配char top=STTop(&st);STPop(&st);//只要有一个不匹配,直接返回false//左括号和右括号相等说明不了问题,只能说明这一次,这一对括号匹配,还有其它括号不匹配的//所以要找到不继续的条件if((*s == ']' && top!= '[')||(*s == ')'&& top !='(')||(*s=='}' && top!='{')){STDestroy(&st);return false;}}++s;//字符指针的移动}bool ret=STEmpty(&st);//栈不为空那就是falseSTDestroy(&st);return ret;
}
代码执行:

本文结束,若有错误,欢迎改正,谢谢支持!
相关文章:
【栈与队列面试题】有效的括号(动图演示)
leetcode20.括号匹配问题 前言: 💥🎈个人主页:Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上栈与队列的面试OJ题目 目录 leetcode20.括号匹配问题 1.问题描…...
基于matlab实现的弹簧振动系统模型程序(动态模型)
完整代码: clear all; %System data m1.0; zeta0.01; omega01.0; Dt1.0; f01.0; x00.0; dotx00.0; xmaxsqrt(x0^2(dotx0/omega0)^2)min([0.5*abs(f0)*Dt/(m*omega0) f0/omega0^2]); omegadomega0*sqrt(1-zeta^2); dt00.1*pi/omega0; nstep500; a0.70; b0.…...
哨兵1号(Sentinel-1)SAR卫星介绍
1. 哥白尼计划 说起欧空局的哨兵1号,就不得不先说一下欧空局的“哥白尼计划”。 欧空局的哥白尼计划(Copernicus Programme)是欧空局与欧盟合作的一项极其重要的地球观测计划。该计划旨在提供免费开放的、可持续的地球观测数据,…...
[maven] scopes 管理 profile 测试覆盖率
[maven] scopes & 管理 & profile & 测试覆盖率 这里将一些其他的特性和测试覆盖率(主要是 jacoco) scopes maven 的 scope 主要就是用来限制和管理依赖的传递性,简单的说就是,每一个 scope 都有其对应的特性&…...
css网页打印字体设置
media print {font-family:"SimHei";color: #000;border-color: #000; }常用字符编码表 中文名英文名Unicode 编码黑体SimHeiSimHei微软雅黑Microsoft YaHei5FAE\8F6F\96C5\9ED1宋体SimSun\5B8B\4F53仿宋FangSong\4EFF\5B8B html5常用转义字符℃ 字符十…...
JAVA高级技术入门(单元测试,反射,注解,动态代理)
JAVA高级技术入门(单元测试,反射,注解,动态代理) 一、Junit单元测试二、反射1.认识反射,获取类概念:快速入门:获取Class对象的三种方式 2.1获取类的构造器2.2获取类的构造器的作用&a…...
uni-app 实现自定义按 A~Z 排序的通讯录(字母索引导航)
创建 convertPinyin.js 文件 convertPinyin.js 将下面的内容复制粘贴到其中 const pinyin (function() {let Pinyin function(ops) {this.initialize(ops);},options {checkPolyphone: false,charcase: "default"};Pinyin.fn Pinyin.prototype {init: functi…...
C++ PrimerPlus 复习 第一章 命令编译链接文件 make文件
第一章 命令编译链接文件 C 有什么呢?C 源代码文件后缀运行C过程可执行代码:编译语法:makeMakefile 基础语法编写完make只要和将要编译的文件放一起就行 然后在该目录使用make命令,就将自动运行;基础的Makefile版本 现…...
微信小程序——常用组件的属性介绍
常用的组件内容标签 text 文本组件类似于HTML中的span标签,是一个行内元素rich-text 富文本标签支持把HTML字符串渲染为WXML结构 text标签的基本使用 通过text组件的selectable属性,实现长按选中文本内容的效果。只有text标签支持长按选中效果&#x…...
【深度学习】 Python 和 NumPy 系列教程(廿七):Matplotlib详解:3、多子图和布局:散点矩阵图(Scatter Matrix Plot)
目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 3、多子图和布局 1. subplot()函数 2. subplots()函数 3. 散点矩阵图(Scatter Matrix Plot) 一、前言 Python是一种高级编程语言,由Guido van Rossum于…...
解决jupyter打开的默认路径问题
已经安装完anaconda,但是jupyter每一次打开的路径都不是自己想要的路径,可以在配置文件中修改jupyter打开的默认路径,具体步骤如下: 首先打开anaconda的命令行 如果有多个环境的,需要输入conda activate 环境名称以下命…...
Git 学习笔记
Git 学习笔记 Git 简介 Git 是一个 开源的分布式版本控制系统。 什么是版本控制? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 什么是分布式版本控制系统? 介绍分布式版本控制系统前,有…...
【Qt】QGroundControl入门3:源码初探
1、源码目录 QGroundControl使用pro来管理工程,可以使用qmake来编译。同时还有CMakeLists.txt,应该可以使用cmake来编译,本人还没有尝试。 QGroundControl是跨平台的,支持android、win、linux、mac、ios系统,在QGCCommon.pri中可见关于跨平台编译的配置。 1.1 目录树 …...
腾讯mini项目-【指标监控服务重构】2023-07-31
今日已办 trace_id传播 关于如何使用 trace_id 创建 span 的思路 【暂未实现 & 测试】 调研 SpanProcessor 阅读源码的test 明日待办 根据 trace_id 创建 span,应该需要 parent span_id 才能有 trace 的树状 span 的关系...
Rust通用编程概念(3)
Rust通用编程概念 1.变量和可变性1.执行cargo run2.变量3.变量的可变性4.常量5.遮蔽5.1遮蔽与mut区别1.遮蔽2.mut 2.数据类型1.标量类型1.1整数类型1.2浮点数类型1.3数字运算1.4布尔类型1.5字符类型 2.复合类型2.1元组类型2.2数组类型1.访问数组2.无效的数组元素访问 3.函数3.1…...
学Python的漫画漫步进阶 -- 第四步
学Python的漫画漫步进阶 -- 第四步 四、运算符4.1 算术运算符4.2 比较运算符4.3 逻辑运算符4.4 位运算符4.5 赋值运算符4.6 运算符的优先级4.7 练一练4.8 运算符的总结全部16步完成后 ,后续就是介绍项目实战,请大家给予点赞、关注! 四、运算符…...
【LeetCode-中等题】18. 四数之和
文章目录 题目方法一:双指针(定2动2) 题目 方法一:双指针(定2动2) 这题可以参考【LeetCode-中等题】15. 三数之和 区别在于,三数之和只需要用一个for循环定住一个数,然后设置两个前…...
每日一题 102二叉树的层序遍历
题目 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2:…...
牛客: BM4 合并两个排序的链表
牛客: BM4 合并两个排序的链表 文章目录 牛客: BM4 合并两个排序的链表题目描述题解思路题解代码 题目描述 题解思路 以链表一为主链表,遍历两条链表 若当前链表二的节点val小于当前链表一的下一个节点val,则将链表链表二的该节点连到链表一的节点的下一个,链表一的当前节点往…...
C语言基础知识点(六)二维数组指针和地址
#include <stdio.h>int main() {int a[2][3] {2, 4, 6,8, 10, 12};printf("a:%p, a1:%p\n", a, a 1); // 相差3*sizeof(int)12,二维数组名是一个指向每一行的指针,a:0061FF08, a1:0061FF14prin…...
200+ 发音人怎么缩小范围:先定风格再试听
🎯 200 发音人怎么缩小范围:先定风格再试听面对顶伯文字转语音工具中超过 200 种发音人,选择困难症难免发作。😵 别急,掌握 「先定风格再试听」 的筛选逻辑,就能快速锁定目标。 本文从风格分类、筛选技巧到…...
硬件工程师显示器选购指南:从垂直分辨率到IPS面板的实战经验
1. 从“够用”到“爽用”:一个硬件工程师的显示器升级心路作为一名整天和代码、电路图、数据手册打交道的硬件工程师,我的工作台就是我的战场。而这块战场上最核心的装备,除了键盘鼠标,就是那块每天要盯着看至少八小时的显示器。几…...
macOS桌面歌词终极解决方案:LyricsX 2.0完整指南
macOS桌面歌词终极解决方案:LyricsX 2.0完整指南 【免费下载链接】Lyrics Swift-based iTunes plug-in to display lyrics on the desktop. 项目地址: https://gitcode.com/gh_mirrors/lyr/Lyrics 你是否曾经在听音乐时,想要跟着歌词一起唱却发现…...
FPGA二进制除法器设计:从算法原理到Verilog实现与优化
1. 项目概述:在FPGA中实现二进制除法在数字电路设计领域,尤其是在现场可编程门阵列(FPGA)中实现数学运算,除法器一直是一个颇具挑战性的课题。与加法、减法乃至乘法相比,除法运算在硬件实现上要复杂得多&am…...
Cursor Pro激活器:终极解决方案告别API限制,实现无限免费使用
Cursor Pro激活器:终极解决方案告别API限制,实现无限免费使用 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youv…...
Modbus RTU 与 Modbus TCP 深入指南-结束语
结束语本指南涵盖了Modbus RTU和Modbus TCP的物理层、数据链路层、报文格式、CRC算法、通信模型、功能码详解、性能优化、安全加固、故障排查、工程实践、过渡策略及现代替代方案。核心要点回顾:RTU:串口,远距离,简单可靠…...
从数据模型到领域驱动设计:数据库抽象与微服务实践的演进
在软件开发的漫长历史中,如何有效地对现实世界进行建模,始终是核心挑战之一。从早期的层次数据库到当今的微服务架构,数据模型作为连接业务需求与技术实现的桥梁,经历了深刻的演变。本文基于对概念数据模型、基本数据模型和面向对象模型的系统探讨,进一步延伸到领域驱动设…...
CentOS7网络配置与XShell连接实战:从零搭建远程管理环境
1. 环境准备与工具安装 第一次接触Linux服务器管理的新手,往往会被网络配置和远程连接这两个基础操作难住。我自己刚开始学习时,光是让虚拟机联网就折腾了大半天。其实只要掌握正确的方法,整个过程完全可以像搭积木一样简单明了。 首先需要准…...
如何轻松掌握开源OCR插件的实用技巧:5步快速上手指南
如何轻松掌握开源OCR插件的实用技巧:5步快速上手指南 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins 你是否曾被纸质文档的数字化问题困扰?或者需要从图片中提取数学公式却找不到…...
MySQL 数据库基础入门:从概念到实战
前言:在程序开发中,数据存储是核心需求之一。虽然文件也能保存数据,但面对安全性、查询效率、海量存储等场景,文件存储的短板暴露无遗。而数据库作为专门的数据分析和管理工具,完美解决了这些问题,成为程序…...

