栈--C语言实现数据结构

news2024/11/26 4:49:30

在这里插入图片描述

本期带大家一起用C语言实现栈🌈🌈🌈

一、栈的概念🌎

栈是一种常见的数据结构,它遵循后进先出(Last In, First Out)的原则。可以将其类比为现实生活中的一摞书或者一叠盘子。

栈由一个连续的内存区域组成,可以存储一系列的元素。在栈的一端称为栈顶,另一端称为栈底。

栈的主要操作包括入栈(Push)和出栈(Pop):

入栈操作将元素放置在栈顶,新增加的元素成为新的栈顶。
出栈操作将栈顶的元素移除,并将其下面的元素成为新的栈顶。
由于栈的特性,只能访问、插入和删除栈顶元素,不支持在任意位置进行操作。

栈具有局部性原理,即后进入栈的元素会先被访问到,而先进入栈的元素则需要等待后面的元素出栈才能被访问到。

栈常用于函数调用、递归算法、表达式求值、括号匹配等场景。

二、栈的操作流程

在这里插入图片描述

三、栈的结构

栈的话,我们可以使用顺序栈链表栈来实现

1.对于顺序栈而言:
方便的便是尾删和尾插了,因为有记录了下标,那么便可以很快的访问到最后一个元素 ,不需要经过遍历
在这里插入图片描述
2.对于链表栈而言:
对于链表而言,尤其是 单链表,尾部的插入删除是很麻烦的。但是 单链表 的头插和头删就很方便,所以可以把 单链表的头部 作为栈顶,单链表的尾部 作为 栈底。 插入数据的时候我们需要选择头插数据
在这里插入图片描述

如果对于双向链表而言,那么就是随便选了,毕竟双向链表无论哪头插入删除数据都很方便

那么对于 顺序栈链式栈 ,那个更加好呢?那必定是 顺序栈,因为使用顺序栈的 尾插尾删非常方便, 且 cpu缓存利用率也更高。而且对于顺序栈实现起来相对简单,所以我们接下来就实现 顺序栈

四、栈的实现

4.1 结构设计

typedef int STDataType;

typedef struct Stack
{
	STDataType* a;
	int top;     //栈顶元素的下一个  或者 栈顶的下标
	int capacity;
}ST;

这里的 top 我们需要好好理解一下。当top的初始值不同时,top可以表示 栈顶的下一个位置的下标 或 栈顶下标

1.当 top = 0,top 表示栈顶的下一个位置的下标:
在这里插入图片描述

top一开始等于0的时候,先压栈,top再++

2、当top=-1的时候,top 表示栈顶元素的下标:

在这里插入图片描述

top=-1的时候,++top,再压栈

4.2 初始化栈

因为我们实现的是顺序栈,因此和顺序表的初始化是一样的
我们创建一个ST s,然后传s的地址即可

void STInit(ST* ps)
{

	assert(ps);

	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;

}

这里我们将top置为0,表示下一个数据的下标

4.3压栈

压栈的话,我们需要判断一下我们的我们的容量capacity是否和我们的ttop相等
如果相等的话,那么就扩容操作

void STPush(ST* ps,STDataType x)
{

	assert(ps);

	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;

		STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity*sizeof(STDataType));

		if (tmp == NULL)
		{
			perror("realloc :fail");
			return;
		}

		ps->a = tmp;

		ps->capacity = newcapacity;

	}
	ps->a[ps->top++] = x;

}

在这里插入图片描述

4.4 出栈

出栈的话是很简单的,只需要将我们的top--就可以了
不过需要注意的是,如果我们的栈为空的话,那我们就不进行出栈操作

void STPop(ST* ps)
{

	assert(ps);
	assert(!STEmpty(ps));

	ps->top--;
}

在这里插入图片描述

4.5 获取栈顶元素

获取栈顶元素的话,我们同样需要判断栈是否为空
如果为空的话,那我们就不去获取栈顶元素的操作
如果不为空,那我们返回下标为top-1那个元素

STDataType STTop(ST* ps)
{

	assert(ps);

	return ps->a[ps->top - 1];

}

4.6 栈中数据的个数

栈中数据个数的话比较简单,只需要返回我们的top即可

int STSize(ST* ps)
{
	assert(ps);

	return  ps->top;

}

4.7 判断栈是否为空

判断栈是否为空的话,我们只需要返回top==0的真假就行

bool STEmpty(ST* ps)
{

	return ps->top == 0;
}

4.8 栈的销毁

对于栈的销毁,那么我们就只需要释放动态开辟的空间,将指针置空。并将 capacity 和 top 两个变量置 0即可

void STDestroy(ST* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;

	ps->top = 0;
}

5、有效的括号

链接:有效的括号
在这里插入图片描述
看完题目之后,我们可以有以下的思路
我们可以让左括号压栈
当我们遇到右括号的时候,如果我们的栈不为空的话,我们就拿栈顶的元素去和右括号比较,如果括号不匹配的话,我们先销毁一下我们的栈,然后再去返回false
如果我们的栈为空的话,那我们就先销毁一下我们的栈,然后直接返回false
当然当我们的括号匹配的时候,我们就让s➕➕和删去栈顶元素,然后再去进行下一轮的判断
当我们的括号全部匹配完了之后,如果我们的栈不为空的话,我们就返回false,不然就反回true,并且销毁栈

在这里插入图片描述

在这里插入图片描述
易错点:
遍历结束,栈不为空
在这里插入图片描述

6. 感谢与交流✅

🌹🌹🌹如果大家通过本篇博客收获了,对顺序表有了新的了解的话
那么希望支持一下哦如果还有不明白的,疑惑的话,或者什么比较好的建议的话,可以发到评论区,
我们一起解决,共同进步 ❗️❗️❗️
最后谢谢大家❗️❗️❗️💯💯💯

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

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

相关文章

前端:运用html+css+js模仿京东上商品图片区域放大特效

前端:运用htmlcssjs模仿京东上商品图片区域放大特效 1. 前言2. 前端界面3. js实现鼠标移入效果4. 实现代码 1. 前言 最近在网页端浏览京东上的商品时,觉得上面的那张gif图片上实现的特效不错,于是自己打算使用htmlcssjs技术来实现一下上述特效效果&#…

【Ceph】Ceph集群应用详解

Ceph集群应用详解 1. 资源池Pool管理1.1 查看Pool集群信息的三种方式1.2 删除Pool资源池 2.创建CephFS文件系统MDS接口2.1 创建cephfs2.2 基于内核的客户端挂载2.3 基于fuse工具方式的客户端挂载 3.创建Ceph块存储系统RBD接口3.1 删除镜像3.2 还原镜像3.3 在线扩容3.4 回滚镜像…

flutter开发实战-卡片翻转动画效果Transform+IndexedStack+rotateAnimation

flutter开发实战-实现卡片翻转动画效果 之前开发中遇到了商品卡片翻转,商品正面是商品图片、商品名称;背面是商品价格,需要做卡片翻转动画。 动画实现即:在一段时间内,快速地多次改变UI外观;由于人眼会产生…

Ext JS中定义和使用类Ext JS风格的html 按钮

Ext JS 的按钮样式如下: 按钮的背景色默认为应用的主色调或是灰色系, 也可以通过样式设置按钮的背景色, 详细可以参考: Ext JS 如何设置工具栏按钮和一般按钮保持统一样式 但是, 在实际开发的场景中有可能某些按钮是不能通过Ext JS的Button 类进行创建的, 但是页面效果…

第三章:内存管理——C++的内存管理方式

系列文章目录 文章目录 系列文章目录前言C/C内存分布C语言中动态内存管理方式面试题 C内存管理模式new/delete操作内置类型new和delete操作自定义类型 operator new与operator delete函数new和delete的实现原理内置类型自定义类型 定位new表达式(placement-new)常见面试题mallo…

JDBC 驱动程序类型

什么是JDBC驱动程序? JDBC驱动程序在JDBC API中实现了已定义的接口,用于与数据库服务器进行交互。 例如,使用JDBC驱动程序,您可以通过发送SQL或数据库命令,然后使用Java接收结果来打开数据库连接并与其进行交互。 J…

el-date-picker 宽度溢出浏览器问题

原文链接&#xff1a; el-date-picker 宽度溢出浏览器问题 问题由来 <el-date-picker v-model"Time" type"datetimerange"range-separator"至"start-placeholder"年/月/日 时:分:秒"end-placeholder"年/月/日 时:分:秒"…

通过迁移加速计划迁移到亚马逊云科技

公司出于许多不同的原因迁移到云。也许他们需要关闭一个老化的数据中心。或者&#xff0c;他们正在寻找太昂贵或太难在内部构建和维护的新功能。无论出于何种原因&#xff0c;在开始规划迁移之前&#xff0c;他们还有另一个问题需要回答&#xff1a;哪种云服务适合他们的需求&a…

基于互一致性学习的半监督医学图像分割

文章目录 Mutual Consistency Learning for Semi-supervised Medical Image Segmentation摘要本文方法实验结果 Mutual Consistency Learning for Semi-supervised Medical Image Segmentation 摘要 提出了一种新的互一致性网络(MC-Net)来有效地利用未标记数据进行半监督医学…

修复git diff正文中文乱码

Linux git diff正文中文乱码 在命令行下输入以下命令&#xff1a; $ git config --global core.quotepath false # 显示 status 编码 $ git config --global gui.encoding utf-8 # 图形界面编码 $ git config --global i18n.commit.encoding utf-8 # …

安装linux子系统时,出现的问题

目录 一、事故原因&#xff1a;适配linux子系统问题 二、事故问题&#xff1a;wsl版本问题 一、事故原因&#xff1a;适配linux子系统问题 事故全文&#xff1a; Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007019e Err…

springboot sentinel 安装 整合 样例-分布式/微服务流量控制

sentinel控制台安装 下载地址&#xff1a;https://github.com/alibaba/Sentinel/releases 本次版本&#xff1a;1.8.6 后台启动&#xff1a; nohup java -Dserver.port7080 -Dcsp.sentinel.dashboard.serverlocalhost:7080 -Dproject.namesentinel-dashboard -jar sentinel-…

基于文本内容的垃圾短信识别实战

1、实战的背景与目标 背景&#xff1a; 垃圾短信形式日益多变&#xff0c;相关报告可以在下面网站查看 360互联网安全中心&#xff08;http://zt.360.cn/report/&#xff09; 目标&#xff1a; 基于短信文本内容&#xff0c;建立识别模型&#xff0c;准确地识别出垃圾短信…

【LeetCode热题100】打卡第38天:课程表实现前缀树

文章目录 【LeetCode热题100】打卡第38天&#xff1a;课程表&实现前缀树⛅前言 课程表&#x1f512;题目&#x1f511;题解 实现前缀树&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第38天&#xff1a;课程表&实现前缀树 ⛅前言 大家好&#xff0c;我是…

udx实现揭秘之---------udx的慢启动带宽探测

我们都知道bew wnd*1000/rtt 当慢启动的时候&#xff0c;每收一个ack,可以这样调整发送速度当前sendspeed sendspeed mss/rtt.并且更新wnd->wnd1. udx的变形版本是sendspeed checksize/rtt; 但是这种增加速度太快&#xff0c;在到达临界点的时候&#xff0c;很容易击…

低功耗设计:为可持续发展带来能源效率的突破

引言&#xff1a; 低功耗设计是面向电子设备和系统的一种设计理念&#xff0c;旨在降低设备的能耗和功耗&#xff0c;提高能源利用效率。在当前节能环保的背景下&#xff0c;低功耗设计成为了电子行业的热门话题&#xff0c;它对于延长电池寿命、提高设备性能和减少能源消耗具有…

选读SQL经典实例笔记08_区间查询

1. 计算同一组或分区的行之间的差 1.1. 最终结果集 1.1.1. sql DEPTNO ENAME SAL HIREDATE DIFF ------ ---------- ---------- ----------- ----------10 CLARK 2450 09-JUN-1981 -255010 KING 5000 17-NOV-1981 370010 …

20 - 队列 - 链队列——队列的链式表示和实现

前面我们学习了 先进先出、后进后出 的线性表- 队列,并且我们是使用数组进行了实现,那么这节课我们来使用链表来实现队列,即链队列! 队列的定义 队列(Queue)也是一种线性表, 但是它仅能在一端进行插入,而另一端进行删除的操作 ,插入的一端称为 队尾rear,删除的一端…

针对Weblogic上的shiro漏洞利用工具

工具介绍 日常项目中&#xff0c;可能会碰见部署在weblogic上的shiro&#xff0c;所以先写了这个生成攻击payload的小Demo&#xff0c;方便后面使用。但目前只支持无回显命令执行&#xff0c;后续回显、内存马功能后面出差后再写。 关注【Hack分享吧】公众号&#xff0c;回复关…

【HCIA】12.网络服务与应用

文件传输协议FTP FTP基于TCP&#xff0c;传输较慢&#xff0c;但是比较可靠。典型的C/S架构。双通道协议。TFTP基于UDP&#xff0c;传输较快&#xff0c;但是不可靠。FTP有两种不同的传输模式 ASCII模式 传输文本文件时会对文本内容进行编码方式转换&#xff0c;提高传输效率&…