【初阶数据结构】深入解析栈:探索底层逻辑

在这里插入图片描述

🔥引言

本篇将深入解析栈:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈初阶数据结构笔记专栏: 初阶数据结构笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

文章目录

  • 一、栈的概念及结构
  • 二、关于实现栈的分析
  • 三、实现栈的相关接口(Satck.h)
    • 3.1 关于top的定义
    • 3.2 栈的初始化
    • 3.3 入栈操作
    • 3.4 出栈操作
    • 3.5 得到栈顶元素
    • 3.6 得到栈里面元素个数
    • 3.7 判断栈是否为空
    • 3.8 栈的打印
    • 3.9 栈的销毁

一、栈的概念及结构

栈是指一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

这里主要分享的是跟数据结构相关的栈,而不是指存储内存一块内存区域栈区,栈区是指CPU寄存器里的某个指针所指向的一片内存区域(存放函数的参数值,局部变量的值等)

其中有两个核心操作压栈和出栈(出入数据在栈顶实现)

  • 压栈:栈的插入操作叫做进栈/压栈/入栈。入数据在栈顶

  • 出栈:栈的删除操作叫做出栈。出数据也在栈顶。
    在这里插入图片描述

在这里插入图片描述

由于栈的特殊结构特性,所以出栈有多种方式,而入栈只有一种

2.一个栈的入栈序列为ABCDE,则不可能的出栈序列为( )
A.ABCDE
B.EDCBA
C.DCEBA
D.ECDBA
答案:D

二、关于实现栈的分析

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。在顺序表章节,说明了静态顺序表的实用价值不大,通常是使用动态,这里实现栈的也是是实现动态栈

在这里插入图片描述

三、实现栈的相关接口(Satck.h)

在这里插入图片描述

3.1 关于top的定义

在实现之前,对top需要有一个定义。当对栈顶元素修改的时候,top作为一个下标。既然top是一个下标,**那么top为0是代表栈为空还是栈存储一个元素,这个是需要我们去定义的(**在顺序表中,也是需要定义的)。所以栈有两种关于栈顶的定义。

  • top为-1代表空,top为0代表一个元素

  • top为0代表空,top指向下一个元素下标

其实上面的两种方式都可以的,在插入过程顺序会出现差异

在这里插入图片描述

下列的实现都是采用第二种top为0代表空,top指向下一个元素下标

3.2 栈的初始化

void STInit(ST *pst)
{
	assert(pst);//指向一个有效的结构体
	pst->a = NULL;
    pst->top =pst->capacity= 0;
}

3.3 入栈操作

void STPush(ST* pst, StackDataType x)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		StackDataType *tmp = (StackDataType*)realloc(pst->a, sizeof(StackDataType)*newcapacity);
		if (tmp==NULL)
		{
			perror("realloc fail!!!");
			return 1;
		}
		pst->capacity = newcapacity;
		pst->a = tmp;//保证安全返回
	}
	pst->a[pst->top] = x;//插入 
	pst->top++;//注意top的意义--之后里面为1没有给数值
}

这里需要注意的是:这里插入就是相当于顺序表的尾插,只有栈顶进行插入,所以没有必要单独实现扩容接口,直接在插入时需要空间进行扩容操作

3.4 出栈操作

void STPop(ST* pst)//跳出
{
	assert(pst);
	assert(pst->top > 0);//top为0,则是为空
	pst->top--;//元素个数--
}

这里需要注意的是:相当于顺序表的尾删,同时要满足保证有数据给你删除

在这里插入图片描述

3.5 得到栈顶元素

StackDataType STTOP(ST* pst)//得到栈顶元素
{
	assert(pst);
	return pst->a[pst->top-1];//这里减的话就会有问题
}

这里需要注意的是:这里top是指向下一个元素的下标,需要-1到达栈顶元素下标

3.6 得到栈里面元素个数

int STSize(ST* pst)
{
	return pst->top;//个数
}

3.7 判断栈是否为空

bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;//为0就是空,为真
}

3.8 栈的打印

void STPrintf(ST* pst)
{
	while(!STEmpty(pst))
	{
		printf("%d", STTOP(pst));
		STPop(pst);
		printf("\n");
	}
}

这里需要注意的是:打印是打印栈顶元素,为了下次打印,需要出栈得到新栈顶元素。当栈里面没有数据时,就不要再打印数据,没有数据打印。

3.9 栈的销毁

void STDestroy(ST* pst)//销毁
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->top =pst->capacity = 0;
}

请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二初阶数据结构笔记,希望对你在学习初阶数据结构中有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kylin系列:架构和高级功能详解

目录 一、Kylin的架构 1.1 总体架构概述 1.2 数据源 1.3 元数据存储 1.4 构建引擎 1.5 存储引擎 1.6 查询引擎 1.7 用户接口 二、Kylin的高级功能 2.1 多维立方体(Cube) 2.1.1 Cube的定义 2.1.2 Cube的构建 2.2 查询优化 2.3 数据模型和星型模式 2.3.1 数据模…

我的常见问题记录

1,maven在idea工具可以正常使用,在命令窗口执行出现问题 代码: E:\test-hello\simple-test>mvn clean compile [INFO] Scanning for projects... [WARNING] [WARNING] Some problems were encountered while building the effective model for org.consola:simple-test:jar…

SpringBoot系列之搭建WebSocket应用

SpringBoot系列之@ServerEndpoint方式开发WebSocket应用。在实时的数据推送方面,经常会使用WebSocket或者MQTT来实现,WebSocket是一种不错的方案,只需要建立连接,服务端和客户端就可以进行双向的数据通信。很多网站的客户聊天,也经常使用WebSocket技术来实现。 WebSocket…

[巨详细]使用HBuilder-X新建uniapp项目教程

文章目录 安装HBuilder-X启动uniapp项目其他:下载预览浏览器下载终端插件想用uni-ui 安装HBuilder-X 详细步骤可看上文》》 启动uniapp项目 先打开HBuilder-X 点击新建项目 选择uniapp侧边栏,mian中的点击浏览 选择已经安装到本地的uniapp项目&#…

多商户零售外卖超市外卖商品系统源码

构建你的数字化零售王国 一、引言:数字化零售的崛起 在数字化浪潮的推动下,零售业务正经历着前所未有的变革。多商户零售外卖超市商品系统源码应运而生,为商户们提供了一个全新的数字化零售解决方案。通过该系统源码,商户们可以…

SpringIOC核心源码

一、Spring IOC容器源码解析 1、Spring IOC容器的核心类 (1)BeanFactory与ApplicationContext (2)默认容器DefaultListableBeanFactory a. DefaultListableBeanFactory实现的接口 b.DefaultListableBeanFactory继承的类&#…

【TB作品】MSP430G2553单片机,红外双机通信,红外通信程序

文章目录 NEC 红外通信协议实验步骤1. 硬件连接2. 程序说明红外发射部分红外接收部分 说明帮助 NEC 红外通信协议 NEC 红外通信协议是一种广泛应用于遥控器设备的红外通信协议。它采用脉冲宽度调制(PWM)来编码数据,并使用38kHz的载波频率进行传输。协议的特点如下&…

让在制品管理更有效

徐总的工厂生产线非常繁忙,每天都在不停地运转。但在制品的流转和存储也非常混乱,导致了很多问题的出现。 一方面,由于缺乏有效的管理,在制品的库存不断增加,占用了大量的资金和空间资源。这些库存不仅增加了库存成本&…

麦肯锡:量子传感究竟在何处可以发光发热

量子传感技术已经提供价值,潜在的应用案例可以塑造多个行业。有四种核心技术具有应用前景:固态自旋、中性原子、超导电路和离子阱,它们具有在广泛的物理属性上的传感能力,包括磁场、电场、旋转、温度、重力、时间和压力。选择哪种…

HTML(23)——垂直对齐方式

垂直对齐方式 属性名:vertical-align 属性值效果baseline基线对齐(默认)top顶部对齐middle居中对齐bottom底部对齐 默认情况下浏览器对行内块,行内标签都按文字处理,默认基线对齐 导致图片看起来会偏上,文字偏下。 示例&#…

USB2.0学习1--基本概念

目录 1.USB概念 2.USB协议发展 3.USB接口类型 3.1 TYPE类型 3.2 Mini类型 3.3 Micro类型 4. USB体系结构和关键概念 4.1 USB工作原理 4.2 USB物理拓扑结构 4.3 USB逻辑拓扑结构 4.4 USB软件架构 4.5 USB数据流模型 4.5.1 USB设备端点 4.5.2 USB管道 4.6 USB即插…

高晓松音频 百度网盘,高晓松音频 百度网盘资源,百度云大全

讲座主要围绕分享了自己的心得和体会,以及对产业现状的深刻洞察。认为,不仅是一种艺术形式,更是一种生活方式。他鼓励年轻人要勇于追求自己的音乐梦想,同时也要关注音乐产业的发展趋势,为音乐产业的繁荣贡献自己的力量…

自动预约申购 i茅台工具完善

自动预约申购茅台工具 概述新的改变界面预览 概述 今天刷到一个windows自动刷茅台的工具,是用wpf实现的,看到作者最后是2023年更新的,评论中有好多人提出一些需求,刚才在学习wpf,就试着完善了一下。 工具下载&#x…

分布式系列之限流组件

概述 在高并发场景下,请求量瞬间到达,后端服务器即使有缓存、集群主备、分库分表、容错降级等措施,也有可能扛不住这请求量,因此可考虑引入限流组件。限流的目的:防止恶意请求流量或流量超出系统承载。 应用场景&…

DEtection TRansformer (DETR)与YOLO在目标检测方面的比较

1. 概述 计算机视觉中的目标检测是一个复杂而有趣的领域,它涉及到让计算机能够识别图像中的物体,并确定它们的位置。下面是DETR和YOLO这两种目标检测方法简单比较: 1.1 YOLO YOLO是一种非常流行的目标检测算法,它的核心思想是将…

IDEA 2024.01版本 git分支merge合并

使用idea工具来进行merge合并 1、拉取远端分支信息 2、我的分支是sprint-240627,我要将test分支合并到我这个分支上 找到test分支 3、选择【Merge origin/test into sprint-240627】 从test合并到我们要合并得分支上,结束 4、如果有冲突,就解决冲突即可…

5. zabbix分布式监控

zabbix分布式监控 一、zabbix分布式监控二、zabbix分布式监控部署1、环境描述2、zabbix proxy的部署2.1 安装zabbix proxy相关的软件2.2 创建proxy需要的库、导入表2.3 编辑zabbix proxy配置文件,指定数据库连接2.4 启动zabbix proxy 3、在zabbix server添加代理4、…

基于 ROS 的 Terraform 托管服务轻松部署文本转语音系统 ChatTTS

介绍 ChatTTS是专门为对话场景设计的文本转语音模型,例如LLM助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。ChatTTS webUI & API 为 ChatTTS 提供了网页界面和API服务。 资源编排服务(Resource Orc…

竞赛选题 python opencv 深度学习 指纹识别算法实现

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python opencv 深度学习 指纹识别算法实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:4分创新点:4分 该项目较为新颖…

.locked勒索病毒详解 | 防御措施 | 恢复数据

引言 在数字化飞速发展的今天,我们享受着信息技术带来的便捷与高效,然而,网络安全问题也随之而来,且日益严重。其中,勒索病毒以其狡猾的传播方式和巨大的破坏性,成为了网络安全领域中的一大难题。.locked勒…