栈的实现以及c语言解决括号匹配问题

news2024/11/28 18:45:29

一、栈的实现

1、头文件

typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top;		// 栈顶
	int _capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps); 
// 入栈 
void StackPush(Stack* ps, STDataType data); 
// 出栈 
void StackPop(Stack* ps); 
// 获取栈顶元素 
STDataType StackTop(Stack* ps); 
// 获取栈中有效元素个数 
int StackSize(Stack* ps); 
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps); 
// 销毁栈 
void StackDestroy(Stack* ps); 

2、函数实现

a、初始化

top为栈顶的位置但是给其初始化时要考虑其初始化为什么(因为我们访问栈顶元素时,是通过top实现的,即下标访问,且栈的特点为先出后进,所以用栈时只考虑栈顶元素,其他位置不考虑),所以会有如下情况:

这里我选择第二种方式,因为判断栈空间时直接比较top和capacity的大小即可:
 

// 初始化栈 
void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;//此时top为栈顶元素的下一个位置
}

b、销毁栈

void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;//为了严谨置为0
}

c、入栈

入栈之前要像和实现顺序表的时候,去判断空间是否够用:

void StackPush(Stack* ps, STDataType data)
{

	assert(ps);
	int newcapacity = 0;
	STDataType* tmp = NULL;
	if (ps->_top == ps->_capacity)
	{
		if (ps->_capacity == 0)//为0给空间为4
		{
			newcapacity = 4;
		}
		else//扩二倍
		{
			newcapacity = 2 * ps->_capacity;
		}
		//int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;也可以直接一个三目操作符搞定
		tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(0);// 退出程序
		}
		ps->_capacity = tmp;
		ps->_capacity = newcapacity;
	}
	ps->_a[ps->_top] = data;//top指向下一个位置直接加
	ps->_top++;
}

d、出栈

出栈其实非常简单只需要将top减1就可以了,但要注意top不能减到0,因为指向0的时候就没有元素了,数组大小为0;

void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);
	ps->_top--;
}

e、获取栈顶元素

STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);//保证有栈顶元素
	return ps->_a[ps->_top - 1];
}

f、获取栈元素个数

int StackSize(Stack* ps)
{
	assert(ps);
	assert(ps->_top >= 0);//数组元素个数不能为负
	return ps->_top://top就是数组元素个数
}

g、判断栈是否为空

int StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->_top == 0;//返回这个表达式的结果即可
}

二、括号匹配问题

这题恰好用到了我们刚昂实现的栈的知识,我们就会有这样的思路,如果为左括号则入栈,再将栈顶元素和下一个字符匹配,如果匹配成功则出栈,否则继续匹配,直到字符串读完.(这里注意题目中传的是字符串的首地址,那么我们可以通过一个一个解引用,来实现入栈)。

实际上我们也可以先将所以的左括号入完栈后再一个一个进行比较,如果不对字符串向下走,但是这样会遍历两次,时间复杂度为O(N),那么,我们不如变入栈边比较,因为会对字符串进行调整,对比成功的直接出栈 ,所以不用担心会对比两次的情况,时间复杂度还是O(N)。

那么有没有可能出现错过的情况?这里我们就要认真审题

随便 举个例子:我们会发现左括号和右括号总是成对出现的,当左括号入栈时,下一个一定是其对应的右括号。

这是第一种特殊情况,如果字符穿读完栈不为空时,说明不匹配,最后出循环时要加一个判断是否为空

这是第二种特殊情况,当开始为右边括号,则开始不入栈,最后出栈栈为空,根据前面,判断为真,但是为假,所以我们要在比对前加一步判断栈是否为空的情况,如果为空,则为假(因为没有左括号和右括号匹配)。

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

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

相关文章

C语言内存函数memcpy与memmove

一.memcpy的使用和模拟实现 1.函数原型 void* memcpy(void* destination, const void* source, size_t num); destination是目标内存块的指针 source是源内存块的指针 num是要复制的字节数 .函数memcpy从source的位置开始向后复制 num个字节 的数据到destination指向的内存位置…

无人零售,重塑购物新纪元

在这个快节奏的时代,科技的每一次跃进都在悄无声息地改变着我们的生活方式。而今,无人零售正以雷霆之势,颠覆传统购物模式,为我们带来前所未有的便捷与智能体验。想知道无人零售如何彻底改变我们的购物方式吗?跟随我&a…

2024五一劳动节活动策划方案

2024五一劳动节打工人青松游园大会(劳动节放青松主题)活动策划方案-51P.pptx 活动策划信息: 方案页码:51页 文件格式:PPT 方案简介: 劳动是世界上最伟大的事 所以我们该把一些劳动留给明天&#xff0…

Offline:IQL

ICLR 2022 Poster Intro 部分离线强化学习的对价值函数采用的是最小化均方bellman误差。而其中误差源自单步的TD误差。TD误差中对target Q的计算需要选取一个max的动作,这就容易导致采取了OOD的数据。因此,IQL取消max,,通过一个期望回归算子…

【Stable Diffusion本地部署简易教程】从入门到实践

Stable Diffusion 本地部署指南:简单易懂的图文教程 引言 Stable Diffusion是一种深度学习模型,用于生成高质量的图像。本地部署意味着你可以在自己的计算机上运行这个模型,从而无需依赖于在线服务。本教程将循序渐进地指导你如何在自己的计…

勾股定理 口诀

def t_o(a):t int(a/2)b t*t-1c t*t1f (a*ab*bc*c)print(f,ou,a,b,c,a*ab*b,c*c)def t_j(a):t a*abint(t/2)c t-bf (a*ab*bc*c)print(f,j-,a,b,c,f,a*ab*b,c*c)for i in range(2,100,2):t_o(i)t_j(i1) 奇数平方写连续 偶数半方加减一

Java 框架安全:Spring 漏洞序列.(CVE-2022-22965)

什么叫 Spring 框架. Spring 框架是一个用于构建企业级应用程序的开源框架。它提供了一种全面的编程和配置模型,可以简化应用程序的开发过程。Spring 框架的核心特性包括依赖注入(Dependency Injection)、面向切面编程(Aspect-Or…

【网络编程】http协议

预备知识 什么是http协议 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一个应用层的协议,用于在网络中传输超文本(如HTML文档)。HTTP协议建立在TCP/IP协议之上,是Web浏览器和Web服务器…

数据结构之链表深度讲解

小伙伴们,大家好呀,上次听我讲完顺序表想必收获不少吧,嘿嘿,这篇文章你也一样可以学到很多,系好安全带,咱们要发车了。 因为有了上一次顺序表的基础,所以这次我们直接进入正题,温馨…

Meta最新研究: Flash Attention 为何是系统性能瓶颈?

I. 引言 随着机器学习趋向于更大和更复杂的模型,模型训练过程变得越来越计算和资源密集。生成式AI的出现进一步推动了模型开发的边界,大型语言模型(LLMs)通常在数百或数千个GPU上训练数月。以LLaMA2的70-B参数模型为例,需要1,720,320 GPU小时来训练。对于如此长的训练作业,训练…

2024-05-07 商业分析-赚钱之前怎么预估风险-记录

摘要: 2024-05-07 商业分析-赚钱之前怎么预估风险-记录 赚钱之前怎么预估风险 好,大家好,今天我们来讲的是叫什么赚钱之前怎么评估风险啊,这个问题啊提的很好啊,我们待会儿来讲啊。呃,首先呢今天这个主题呢来自于昨天…

腾讯云服务器之ssh远程连接登录

一、创建密钥绑定实例 创建密钥会自动下载一个私钥,把这个私钥复制到c盘 二、设置私钥权限 1、删除所有用户权限 2、添加当前用户权限 查看当前用户名 echo %USERNAME%三、ssh远程连接到服务器 ssh ubuntu175.xxx.xxx.112 -i C:\Crack\cs2.pem四、修改root密码 s…

2024年荆州中级工程师报名开始了吗?

2024年荆州中级工程师职称报名已经开始了 2024年荆州中级职称报名时间: (一)网上报名时间: 4月26日9时至5月10日16时。超过时间将不能操作。 (二)网上缴费时间: 4月26日9时至5月10日24时 网上…

太原理工大学Python数据分析原理与应用(课外考题:8~11章)

这部分大概只考10分,且大部分出在选择题,填空最多一两个 (仅供参考) 第十章 (理解概念为主,无需看推导过程) 第十一章

常用算法汇总

作者:指针不指南吗 专栏:算法篇 🐾算法思维逻辑🐾 文章目录 1.判断闰年2.计算从某天到某天的天数3.二分4. 前缀和5.差分6.图论6.1dfs6.2走迷宫 7.最短路7.1dijkstra7.2foly 8.并查集9.数论9.1gcd lcm9.2判断素数(质数)9.3分解质因…

TCP经典异常问题探讨与解决

作者:kernelxing TCP的经典异常问题无非就是丢包和连接中断,在这里我打算与各位聊一聊TCP的RST到底是什么?现网中的RST问题有哪些模样?我们如何去应对、解决?本文将从RST原理、排查手段、现网痛难点案例三个板块自上而…

AIGC技术带给我们什么?基于AIGC原理及其技术更迭的思考

AIGC技术带给我们什么?基于AIGC原理以及技术更迭的思考 前言 AI,这个词在如今人们的视野中出现频率几乎超过了所有一切其他的事物,更有意思的是,出现频率仅次于这个词的,几乎都会加上一个修饰亦或是前缀——AI&#…

【刷题篇】双指针(一)

文章目录 1、移动零2、复写零3、快乐数4、盛最多水的容器 1、移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 class Solution { pub…

【机器学习系统的构建】从模型开发的过程讲清楚K-Fold 交叉验证 (Cross-Validation)的原理和应用

0、前言 最近在学习集成学习的时候了解到了k折交叉验证,其实在之前学习吴恩达老师的课程中也学过交叉验证,但是当时也不是很明白。这次借着自己的疑问以及网上搜找资料,终于把交叉验证给弄明白了。 在弄清楚前,我有这样几个疑问…

Windows系统和unbtun系统连接usb 3.0海康可见MVS和红外艾睿相机

一.海康可见USB3.0工业面阵相机 海康usb相机需要去海康官网上下载对应系统的MVS客户端及SDK开发包 海康机器人-机器视觉-下载中心 选择Windows系统和unbtun(我是linux aarch64,所以选择了对应压缩包解压) Windows系统 1.双击安装包进入安装界面&…