栈——有效的括号

news2024/11/15 21:32:15

在这道题中给出一个字符串包含三种不同的括号,需要判断这三个括号是否能相互匹配。因为方向需要保证不出错,所以我们可以想到如果指向字符的指针为左括号时,可以将它拿出,与下一个字符进行匹配若能匹配则继续匹配,如果不能匹配则返回false。那么将左括号拿出要存放在哪里呢,我们可能会想到创建一个字符去存储,但是若字符串中只含有一个半括号或左括号数目大于右括号时我们将无法判断。所以我们可以应用栈的知识,将左括号存储在栈内,若下一个是右括号则与栈的头元素进行配对,若能配对,则继续,若不能则返回false。且应用栈的优点还有就是我们可以在最后判断栈是否为空,若不为空则证明左括号数目大于右括号,返回false。若最后栈为空则证明所有括号都配对完成,就返回true。我们现在来实现一下这个方法。

//动态的栈
typedef  int 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 = 0;
	pst->capacity = 0;
}
//栈的进栈
void STPush(ST* pst, STDataType x)
{
	assert(pst);
	//扩容
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;
		STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	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;
}

大家感兴趣的可以自行尝试哦~

. - 力扣(LeetCode)

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

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

相关文章

一文搞懂Window、PhoneWindow、DercorView、WindowManage

戳蓝字“牛晓伟”关注我哦! 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章,技术文章也可以有温度。 本文摘要 通过本文您可以了解PhoneWindow,Window,DecorView,WindowManager,WindowManag…

虚拟机【linux】配置无线网络

虚拟机【linux】配置无线网络 在Linux系统中配置网卡是一个常见的任务,特别是当你需要手动设置IP地址、子网掩码、网关或DNS服务器等信息时。不同的Linux发行版可能有不同的配置方法,但以下是一些基本且通用的步骤来配置网卡。 1. 确定网卡名称 首先&…

【云原生】Kubernetes中如何通过Pod名称查询Docker容器ID,通过Docker容器ID查询Pod名称?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

中秋节不容错过的送礼指南,除了月饼,还有五大科技好物助力团圆

中秋节,作为中华民族的传统节日,承载着深厚的文化内涵和家庭团聚的美好愿望。在这个月圆人圆的时刻,送礼成为了表达情感和祝福的重要方式。虽然月饼作为传统的象征,总是节日礼单上的首选,但随着科技的发展,…

SpringCloud乐尚代驾学习笔记:司机端登录(四)

SpringCloud乐尚代驾学习笔记:司机端登录(四) 文章目录 SpringCloud乐尚代驾学习笔记:司机端登录(四)1、司机端微信小程序登录1.1、准备工作1.2、接口开发1.2.1、service-driver模块1.2.2、openFeign远程调…

bitmap(位图)的使用

零存零取,整存零取,整存整取, 零存整取 bitmap介绍 位图不是真正的数据类型,它是定义在字符串类型中,一个字符串类型的值最多能存储512M字节的内容, 位上限:2^(9(512)10(1024)10(1024)3(8b1B))2^32b 语句操作: s…

数据结构与算法 第四天(串、数组、广义表)

串(String) 任意字符组成的有限序列 串的类型定义 串的顺序存储结构 模式匹配算法 确定主串所含字串第一次出现的位置。 BF算法 穷举法,从每个字符开始依次匹配 KMP算法 链式存储 数组 基本操作 特殊矩阵存储 对称矩阵 三角矩阵 对角矩阵…

UDP英译汉网络词典

这里我们用UDP实现一个简单的英译汉小词典。我们还是仿照前一篇的UDP编程,将各自的组件封装起来,实现高内聚低耦合。 一. 字典翻译功能实现 首先我们将我们的字典知识库放在txt文本中。 apple: 苹果 banana: 香蕉 cat: 猫 dog: 狗 book: 书 pen: 笔 ha…

容器访问外网

目录 1 容器访问外网 1.1 容器访问外网的原理 1.2 容器与外网通讯原理解剖 2 docker跨主机网络 2.1 实现docker跨主机通讯方式 2.2 macvlan网络方式实现跨主机通信 2.2.1 macvlan网络方式 2.2.2 macvlan网络间的隔离和连通 2.2.3 实现方法如下: 1 容器访问外网 1.…

Django+Vue社区养老管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者&…

详解Spring AOP

前言👀~ 上一章我们介绍了SpringBoot统一功能相关的知识点,今天来讲解Spring框架另外一个核心AOP,细!!! 什么是AOP? 什么是面向切面编程呢? 什么是面向特定方法编程呢&#xff1…

Bahdanau注意力机制

介绍 在Bahadanu注意力机制中,本质上是序列到序列学习的注意力机制实现,在编码器-解码器结构中,解码器的每一步解码过程都依赖着整个上下文变量,通过Bahdanau注意力,使得解码器在每一步解码时,对于整个上下…

ET6框架(七)Excel配置工具

文章目录 一、Excel表的基本规则:二、特殊特殊标记三、编译路径说明四、动态获取数据五、可导表类型查看: 一、Excel表的基本规则: 在框架中我们的Excel配置表在ET > Excel文件夹中 1.在表结构中需要注意的是起始点必须在第三行第三列,且…

91.游戏的启动与多开-游戏启动

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:90.游戏安全项目-项目搭建与解析 以90.游戏安全项目-项目搭建与解析它的代码为基础进行…

[java][代码] java中date格式化输出时间字符串

Date date new Date();//具备默认的风格//DateFormat dateFormDateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);DateFormat dateFormnew SimpleDateFormat("yyyy-mm-dd");System.out.println(dateForm.format(date)); 这段Java代码演示了如何使用S…

YOLOv9改进策略【模型轻量化】| PP-LCnet

一、本文介绍 本文记录的是利用PP-LCNet中的DepSepConv模块优化YOLOv9中的RepNCSPELAN4。YOLOv9在使用辅助分支后,模型的参数量和计算量相对较大,本文利用DepSepConv模块改善模型结构,使模型在几乎不增加延迟的情况下提升网络准确度。 文章目…

海外新闻稿发布对区块链项目具有深远的影响

在知名媒体平台上发布新闻稿对区块链项目具有深远的影响,例如全球雅虎,彭博社这些全球知名财经媒体,能够显著提升项目的曝光度和信誉,吸引潜在投资者以及其他利益相关者的关注。以下是几个方面的详细分析: 1. 增强品牌…

区块链通证系统功能分析

区块链通证系统功能分析涉及多个关键方面,以确保系统能够满足不同的业务需求和合规性要求。 同质与非同质通证:区块链通证系统需要支持同质通证(如ERC-20)和非同质通证(如ERC-721),以适应不同类…

如何快速掌握销售数据?一张报表就够了

在销售管理中,数据是企业做出战略决策的重要依据。有效的销售数据分析不仅能帮助企业精准把握市场动向,还能提高销售团队的工作效率,优化客户关系管理。然而,面对海量的销售数据,如何高效地解读这些数据呢?…

Java SpringBoot实现大学生平时成绩量化管理系统:一步步教你构建高效成绩统计,集成MySQL数据库,打造自动化评分流程

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…