用栈解决有效的括号匹配问题

news2024/9/24 5:29:29

 

//用数组实现栈
typedef char DataType;
typedef struct stack
{
	DataType* a;//动态数组
	int top;//栈顶
	int capacity; //容量
}ST;

void STInit(ST*pst);//初始化

void STDestroy(ST* pst);//销毁所有空间

void STPush(ST* pst, DataType x);//插入数据到栈中

void STPop(ST* pst);//数据跳出栈顶

DataType SToPop(ST* pst);//访问栈顶元素

bool STEmpty(ST* pst);//判空函数

int STSize(ST* pst);//记录栈内有多少元素(有多少人)



void STInit(ST* pst)//初始化
{
	assert(pst);
	pst->a = NULL; 
	pst->capacity = 0;
	pst->top = 0;
}
void STDestroy(ST* pst)//销毁所有空间
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;
}
void STPush(ST* pst, DataType x)//插入数据到栈中
{
	assert(pst);
	if (pst->capacity == pst->top)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;//是0就给4,不是0就乘2
		DataType* tmp = (DataType*)realloc(pst->a, sizeof(DataType) * newcapacity);//扩容好的数组地址
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}

	pst->a[pst->top] = x;//栈顶放入元素
	pst->top++;

}

void STPop(ST* pst)//数据跳出栈顶
{
	assert(pst);
	assert(!STEmpty(pst));
	pst->top--;
}

DataType SToPop(ST* pst)//访问栈顶元素
{
	assert(pst);
   assert(!STEmpty(pst));
	return pst->a[pst->top - 1];
}

bool STEmpty(ST* pst)//判空函数
{
	assert(pst);
	return pst->top == 0; //等于0,bool就真了,
}

int STSize(ST* pst)//记录栈内有多少元素(有多少人)
{
	assert(pst);
	return pst->top;
}


bool isValid(char * s){
    ST kit;
    STInit(&kit);
   while(*s)
   {
      //1. 左括号入栈    '(', '[', '{'
      //2. 右括号出栈匹配 ')', ']', '}'
      //3.栈是空那就是匹配成功的,栈不是空就匹配失败"([{ ])"
      //只要有一对不相等就返回false
     if(*s == '(' ||*s == '{' ||*s == '[')
     {
        STPush(&kit,*s);
     }
     else
     {
        if(STEmpty(&kit))//防止"[{}])"还在调用SToPop函数访问造成越界访问
        {
           return false;
        }
        char tmp =SToPop(&kit);
         STPop(&kit);
        if(*s == ')' && tmp != '(' 
         || *s =='}'&& tmp != '{' 
         || *s ==']' && tmp != '[' )//只要有一对不相等就返回false
        {
           return false;
        }
      
     }
      ++s;
   } 
   bool yesno = STEmpty(&kit);//栈是空那就是匹配成功的,栈不是空就匹配失败"([{ ])"
  STDestroy(&kit);
  return yesno;
}

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

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

相关文章

开学有什么平替电容笔值得买?比较好用的ipad手写笔

相信不少的学生党都已经在开学前入手了iPad,而现在,电容笔作为iPad的一种主要配件,其的性能也在不断地提高,使用电容笔的用户也在不断地增加。因此,如何挑选一款物美价廉的电容笔成为大家最关心的问题。那么&#xff0…

C/C++ : C/C++的详解,C语言与C++的常用算法以及算法的各自用法和应用(初级,中级),C++ CSP考题(J居多,S偏少)的详解,NOI的真题题解

目录 1.C语言 2.C 3.C与C语言的共同/不同点 4.导读 5.相关文章 5.1:Dev-C是Windows 环境下的一个轻量级 C/C 集成开发环境(IDE) 5.2:C是从C语言发展而来的,而C语言的历史可以追溯到1969年 6.C/C最新年度总…

java编译报错,get方法报错

java编译报错,get方法报错 处理方式: 在空间中,将 buid 文件夹删除 再不行的话,重启电脑,删除各种缓存 试试

Java请求Http接口-OkHttp(超详细-附带工具类)

简介:OkHttp是一个默认有效的HTTP客户端,有效地执行HTTP可以加快您的负载并节省带宽,如果您的服务有多个IP地址,如果第一次连接失败,OkHttp将尝试备用地址。这对于IPv4 IPv6和冗余数据中心中托管的服务是必需的。OkHt…

【boost网络库从青铜到王者】第五篇:asio网络编程中的同步读写的客户端和服务器示例

文章目录 1、简介2、客户端设计3、服务器设计3.1、session函数3.2、StartListen函数3、总体设计 4、效果测试5、遇到的问题5.1、服务器遇到的问题5.1.1、不用显示调用bind绑定和listen监听函数5.1.2、出现 Error occured!Error code : 10009 .Message: 提供的文件句柄无效。 [s…

docker限制容器日志大小

文章目录 业务场景问题排查彻底解决 业务场景 我们公司做交通相关业务,我们部门主要负责信控服务,卖信号机的硬件产品和配套的信控平台 由于有部分小项目,可能只有几十个路口,客户预算有限,只给我们老旧的Windows ser…

Google浏览器点击链接打开新标签页

由于新安装的谷歌浏览器点击链接时默认在当前窗口打开非常不方便,这里提供一下解决思路 1、打开浏览器输入任意内容,点击右上角的设置 2、在弹出的选项栏中点击See all Search settings 3、点击Other settings,将指定选项打开即可

数据结构——二叉搜索树

本章代码:二叉搜索树 文章目录 🌲1.二叉搜索树概念🌳2. 二叉搜索树操作🌿2.1 结构定义🌿2.2 插入操作🌿2.3 查找操作🌿2.4 删除操作🌿2.5 遍历 🌴3. 二叉搜索树应用场景&#x1f340…

[JavaWeb]【五】web后端开发-Tomcat SpringBoot解析

目录 一 介绍Tomcat 二 基本使用 2.1 解压绿色版 2.2 启动TOMCAT 2.3 关闭TOMCAT 2.4 常见问题 2.5 修改端口号 2.6 部署应用程序 三 SpringBootWeb入门程序解析 前言:tomcat与SpringBoot解析 一 介绍Tomcat 二 基本使用 2.1 解压绿色版 2.2 启动TOMCAT 2…

作业day4

1.通过字符设备驱动分步注册方式编写LED灯的驱动,应用程序使用ioctl函数编写硬件控制逻辑 head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER; unsigned int OTYPER; unsigned int OSPEEDR; unsigned int PUPDR; unsigned int …

主机防护的重要性和方式

01 主机防护的重要性 主机防护是网络安全的重要组成部分。在互联网时代,网络攻击成为了一种常见的威胁,而主机防护则是保护计算机系统免受网络攻击的重要手段。 主机防护可以防范各种网络攻击,如病毒、木马、黑客攻击等,从而保…

如何做好会员管理,有哪些好用的会员管理系统?

会员管理对于企业或中小商户来说非常重要,会员管理可以建立和维护与顾客之间的紧密关系,通过会员管理系统记录和分析会员的购买历史、偏好和行为,可以更好地了解他们的需求和兴趣,增加销售机会和满意度。 那么我们应该如何做好会员…

【深度学习 | 感知器 MLP(BP神经网络)】掌握感知的艺术: 感知器和MLP-BP如何革新神经网络

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

使用教程|CloudQuery: 数据库操作管控云平台初体验

😀前言 前言:就在刚刚,在一个技术交流群里了解到了一场活动:CloudQuery 社区的有奖征文活动。除了有丰厚的礼物,使用过程中还有技术同学的支持。但是 CloudQuery 这个产品我也没有过多的了解,抱着对产品的好…

AndroidStudio升级Gradle之坑

最近在做旧工程的升级,原来的Gradle版本是4.6的,需要升级到7.6,JDK从8升级到17,一路淌了很多坑,逐个记录下吧 1、Maven仓库需要升级到https 你会遇到这个报错 Using insecure protocols with repositories, without …

item_search-按关键字搜索淘宝商品

一、接口参数说明: item_search-按关键字搜索淘宝商品,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_search 名称类型必须描述keyString是调用key(点…

边缘计算节点BEC典型实践:如何快速上手PC-Farm服务器?

百度智能云边缘计算节点BEC(Baidu Edge Computing)基于运营商边缘节点和网络构建,一站式提供靠近终端用户的弹性计算资源。边缘计算节点在海外覆盖五大洲,在国内覆盖全国七大区、三大运营商。BEC通过就近计算和处理,大…

【Linux命令详解 | tar命令】 tar命令用于打包和解压文件,常用于备份和压缩文件

文章标题 简介一,参数列表二,使用介绍1. 打包文件和目录2. 解包归档文件3. 压缩归档文件4. 列出归档文件内容5. 排除特定文件6. 保留文件权限和所有权7. 保留时间戳8. 增量备份9. 使用文件列表10. 压缩级别控制 总结 简介 在Linux中,tar命令…

游戏出海工具都有哪些?

游戏出海是一个复杂的过程,需要运用多种工具来进行市场分析、推广、本地化等工作。以下是一些常用的游戏出海工具: 一、必备工具: 1、游戏平台:要想进行游戏出海运营,游戏平台时必不可少的,选择游戏平台时…

一节网课中有哪些“黑科技”,猿辅导给出了这样的答案

近年来,AI正以润物细无声的方式重塑多个行业的面貌,教育行业也不例外。同时,随着Chat GPT对社会带来的冲击不断加强,AI教育已经成为整个行业不可逆转的趋势。作为最早踏入智能教育领域的企业之一,猿辅导深谙技术革新对…