Leetcode刷题之有效的括号

news2024/11/28 14:36:49

我们的内心和心智,是决定我们未来命运的最强劲的力量。         -- 奥普拉·温弗瑞
目录

🍁一.有效的括号

🍍1.使用栈实现

🍒2.完整代码:


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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:​​​​​​​

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

做题链接:有效的括号

前言:
在5月13号晚上写了一篇白嫖chatgpt的Edge插件,很难不爱啊的文章,只是随便写写,只想把这个好用的插件分享给大家,但是出乎我的意料,居然上热榜了,这也是我第一次上热榜,浏览量居然高达9000,收藏也达到了惊人的400多。可给我高兴坏了,非常感谢各位CSDN人的支持。未来我将更加努力,把自己学习的历程的分享出来,和大家一起进步。一起加油,再次感谢。

🍁一.有效的括号

这题的意思就是,给你一串字符串括号,让你判断这个字符串里面的括号是否匹配,如果匹配,就返回true,否则返回false。这题我们就可以使用栈来实现。
我们来回忆一下,之前学习的栈是怎么样的。
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除操作,进行数据的插入和删除操作的一端称为栈顶。另一端称为栈底。栈中数据元素遵循后进先出LIFO(last in first out)。

🍍1.使用栈实现

思路:
1.
我们从头开始遍历字符串,当遇到左括号也就是{,[,(的其中一个时,直接把这个左括号入栈。2.然后继续遍历字符串,只要遇到左括号就入栈,遇到右括号也就是},],)的其中一个时,直接把栈顶的左括号出栈。
3.然后判断这两个字符是否括号匹配,如果不匹配,直接返回false,如果匹配,就继续遍历字符串,直到遍历到字符串的尾,如果都匹配,那么就返回true。
老样子我们还是画图来理解一下:

 

 

接着最后三个字符和明显和栈内的字符是匹配的,所以我们返回true。

思路是有了,那我们就可以直接写代码了。
注意细节:容易犯的错误。
1.最后返回true时,栈必须为空,才能保证括号的匹配成功了的。
2.第一个字符如果是右括号,那么肯定就不匹配了,直接返回false。

🍒2.完整代码:

typedef char STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;		// 栈顶
	int Capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, STDataType x);
// 出栈 
void StackPop(Stack* ps);
// 获取栈顶元素 
STDataType StackTop(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);

// 初始化栈 
void StackInit(Stack * ps)
{
	assert(ps);
	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);//动态的开辟空间
	if (ps->a == NULL)
	{
		perror("malloc\n");
		return;
	}
	ps->top = 0;
	ps->Capacity = 4;
}

// 入栈 
void StackPush(Stack* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->Capacity)
	{
		STDataType* temp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->Capacity * 2);
		if (temp==NULL)
		{
			perror("realloc\n");
			return;
		}
			ps->Capacity *= 2;//每次增容尾上一次的二倍
			ps->a = temp;
	}
		ps->a[ps->top] = x;
		ps->top++;//栈内入一个数据,top就要往上面走一步
}

// 出栈 
void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->top>0);
	ps->top--;
}

// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{
	assert(ps);
	return ps->a[ps->top-1];
}

// 销毁栈 
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->Capacity = 0;
}


// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps) {
	assert(ps);
	return ps->top==0;
}
//上面调用实现栈的函数
bool isValid(char * s){
    Stack ps;
    StackInit(&ps);
    while(*s)//遍历字符串
    {
        if(*s=='{'||*s=='('||*s=='[')//如果是左括号就直接入栈
        {
            StackPush(&ps,*s);
        }
        else
        {
            if(StackEmpty(&ps))
            {//当第一个字符为右括号时,即没有入栈,栈为空,直接返回false即可。
                StackDestroy(&ps);
                return false;
            }
            char top=StackTop(&ps);
            StackPop(&ps);
            if((*s=='}'&&top!='{')
            ||(*s==')'&&top!='(')
            ||(*s==']'&&top!='['))
            {
                StackDestroy(&ps);
                return false;//if语句只要有不匹配的,直接返回false
            }
        }
        ++s;
    }
    bool ret=StackEmpty(&ps);//栈为空,那么ret就为真,反之,为假。
    StackDestroy(&ps);
    return ret;
}

 

 

 

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

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

相关文章

Sonar Qube代码质量检测工具安装及基本使用

Sonar介绍 Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。 Sonar Qube可以与多种软件整合进行代码扫描,比如Maven,…

算法套路十七——买卖股票问题:状态机 DP

算法套路十七——买卖股票问题:状态机 DP 状态机DP是一种将动态规划方法应用于有限状态机(Finite State Machine)的问题求解方法。 状态机DP(State Machine DP)是一种动态规划的思想,它通常用于解决一些具…

行动元宣布推出面向精密制造领域的智能运动控制解决方案

近日,AI 工业工程化平台行动元宣布推出面向精密制造领域的智能运动控制解决方案。该方案融合大数据模型、数字孪生以及人工智能技术,通过数字化建模、适配、调试等过程,极大提升终端设备集成方案的设计、选型与测试效率,并通过算法…

你不学,我不学,谁来网安,谁来保卫国家!

一、为什么选择网络安全? 这几年随着我国**《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》**等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前…

PCL点云库(6) — Filters模块空间裁剪器类

目录 6.1 3D包围盒裁剪器Class BoxClipper3D< PointT > 6.2 平面裁剪器Class pcl::PlaneClipper3D< PointT > 6.3 立方体过滤Class pcl::CropBox< PointT > 6.4 曲面或多边形过滤 Class pcl::CropHull< PointT > 6.5 完整代码 6.1 3D包围盒裁剪器…

C语言基础:static关键字

本文结合工作经验&#xff0c;研究C语言中static关键字的用法。 文章目录 1 static关键字概念2 用法与使用场景2.1 修饰全局变量2.1.1 代码示例2.1.2 使用场景 2.2 修饰函数2.2.1 代码示例2.2.2 使用场景 2.3 修饰局部变量2.3.1 代码示例2.4.2 使用场景 3 总结 1 static关键字…

第13章:存储过程和存储函数

一、存储过程 1.1理解 含义&#xff1a; 存储过程stored procedure&#xff0c;思想是一组经过预先编译的SQL语句的封装。 存储过程预先存储在MySQL服务器上&#xff0c;需要执行的时候&#xff0c;客户端向服务器端发出调用存储过程的命令&#xff0c;服务器段把这组SQL执…

当我和ChatGPT-4聊完后,我觉得一切可能已经来不及了

飞机上有wifi&#xff0c;了然无味&#xff0c;在万米高空&#xff0c;和ChatGPT-4开始了一场坦诚的沟通&#xff0c;它全程都表现出高情商&#xff0c;以及不断尽量安抚我的情绪&#xff0c;而这&#xff0c;恰恰令我脊背发凉。 部分文字截取 ZM&#xff1a;我能不能理解每次对…

k8s学习-CKS真题-ImagePolicyWebhook容器镜像扫描

目录 题目环境搭建imagePolicyWebhook搭建 解题任务二任务三任务一检查 模拟考题参考 题目 Context cluster上设置了容器镜像扫描器&#xff0c;但尚未完全集成到 cluster 的配置中。 完成后&#xff0c;容器镜像扫描器应扫描并拒绝易受攻击的镜像的使用。 Task 注意&#xff…

5.17 ARM 作业

1. 2.用for循环实现1~100之间的和 13BA 3.xmind

可以找工作的C端的低代码产品,终于让我找到了

目录 写在前面 低代码平台 平台怎么选 各平台区别 为什么选它 写在前面 大家都知道低代码这个叫法是从B端叫起来的&#xff0c;也就是说不管是业务人员还是开发人员&#xff0c;都是企业内部使用。那么有没有C端的&#xff0c;且免费使用的低代码产品呢&#xff1f; 低代码…

一次性能优化思考过程

前言 最近业务上空闲了下来&#xff0c;也是把之前在开发时自身感受比较大的白屏时间放在了主线上去排查优化&#xff0c;这里记录一下笔者对于移动端vConsole脚本的引入问题全过程。 网络脚本与问题定位 对于白屏时间&#xff0c;与网络传输有很大关系&#xff0c;如图&…

该怎样学习网络安全知识?

首先&#xff0c;必须&#xff08;时刻&#xff09;意识到你是在学习一门可以说是最难的课程&#xff0c;是网络专业领域的顶尖课程&#xff0c;不是什么人、随随便便就能学好的。不然&#xff0c;大家都是黑客&#xff0c;也就没有黑客和网络安全的概念了。 很多朋友抱着学一…

#systemverilog# 之 event region 和 timeslot 仿真调度(五)实战

目录 一 问题代码 二 解决方法 2.1 调换代码顺序 2.2 #0 Delay 2.3 uvm class 执行移到re-avtive 2.4 搭建完备的UVM 验证平台 三 预期波形 经过之前文章的学习&#xff0c;想必大家对systemverilog 仿真调度的理解&#xff0c;应该八九不离十了。今天&#xff0c;我们…

基于STM32的NRF24L01 2.4G通讯模块的驱动实验(HAL库)

前言&#xff1a;本文为手把手教学NRF24L01 2.4G通讯模块的驱动实验&#xff0c;本教程的 MCU 采用STM32F103ZET6与STM32F103C8T6&#xff0c;彼此进行互相通讯。通过 CubeMX 软件配置 SPI 协议驱动NRF24L01 2.4G通讯模块&#xff08;HAL库&#xff09;。NRF24L01 2.4G是嵌入式…

渗透测试--5.2.hash密码的破解

目录 1.hashcat简介 2.hashcat参数 常见参数 哈希类型&#xff08;-m&#xff09; 破解模式&#xff08;-a&#xff09; 3.实例 步骤一&#xff1a;使用hash-identifier工具判断哈希值类型 步骤二&#xff1a;使用字典攻击进行破解 1.hashcat简介 hashcat号称世界上最…

js实现点击改变文字大小

目录 一、前言二、代码实现 一、前言 在编写代码之前我们先来看看通过js获取元素有几种方式&#xff1a; 1.第一种 document.querySelector() 返回文档中匹配指定的选择器组的第一个元素document.querySelectorAll(); 返回文档中匹配指定的选择器组的所有元素 <!DOCTYPE ht…

vector容器 [上]

目录 一、 对于vector的介绍 二、vector的定义 0x01 无参构造 0x02 构造并初始化n个val 0x03 使用迭代器进行初始化构造 0x04 拷贝构造 0x05 比较 三、 vector的遍历 0x01 push_back() 0x02 operator[] 和at() 0x03 遍历 四、vector 容量空间 0x01 max_size : 返回v…

【设置教程】未使用系统分配DNS地址 如何设置?答:

未使用系统分配DNS地址&#xff0c;是你的域名解析DNS地址不是当前系统的DNS地址。 设置方法&#xff1a;先关闭更新。域名控制台--域名列表--安全设置&#xff1a; 通过短信验证。 2、修改DNS地址&#xff1a;域名控制台--域名列表&#xff1a;点击域名&#xff1a; 3、点击&…

C语言函数速查

scanf函数 函数概要&#xff1a; scanf 函数从标准输入流中读取格式化字符串。 与 printf 格式化输出函数相反&#xff0c;scanf 函数是格式化输入函数。 函数原型&#xff1a; #include <stdio.h> ... int scanf(const char *format, ...);参数解析&#xff1a; 1…