数据结构——栈的详细介绍

数据结构——栈

  • 一、栈的结构和概念
  • 二、 栈的两种构建方式
    • ①、用数组进行构建
    • ②、用链表进行构建
  • 三、栈的创建
  • 四、栈的初始化
  • 五、栈的销毁
  • 六、压栈
  • 七、出栈
  • 八、判空
  • 九、获取栈顶元素
  • 十、获取栈的size

一、栈的结构和概念

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

二、 栈的两种构建方式

①、用数组进行构建

在这里插入图片描述

②、用链表进行构建

在这里插入图片描述
本篇我们采用数组构建的方式为大家进行讲解。本篇博客主要从栈的初始化、栈的销毁、压栈出栈等七个方面为大家全面进行栈的讲解。

//初始化
void InitST(ST* pst);
//销毁
void DestoryST(ST* pst);
//压栈
void PushST(ST* pst, STDatatype x);
//出栈
void PopST(ST* pst);
//判空
bool STEmpty(ST* pst);
//获取栈顶元素
STDatatype TopST(ST* pst);
//获取栈的size
int STSize(ST* pst);

三、栈的创建

typedef struct STack
{
	STDatatype* a;//数组
	int capacity;//容量
	int top;//栈顶元素的下一个
}ST;

我们采用结构体的方式创建一个结构体成员变量,其中定义了数组指针a,capacity容量,和top。其中a指向的是栈的开始位置,capacity指向的是栈的结束位置,至于top,则既可以指向栈顶位置,也可以指向栈顶元素的下一个位置,这取决于你对其,如何进行初始化。
在这里插入图片描述

四、栈的初始化

栈的初始化中,最为重要的一步便是如何对pst->top进行相应的初始化,如果我们将pst->top初始化为0,则top将指向栈顶元素的下一个位置。但是如果我们将其初始化为-1,则top将指向栈顶元素。但是如果将其初始化为-1,也会带来一些不必要的麻烦,例如一些不懂的栈结构的人,可能会以为这里初始化错误。所以我们在这里将其初始化为0.

void InitST(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->capacity = 0;//栈顶元素的下一个位置
	pst->top = 0;
}

五、栈的销毁

利用free函数将开辟的内存空间进行释放,并将其置为NULL,并把capacity和top置为0。

void DestoryST(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = pst->top = 0;
}

六、压栈

由于栈的后进先出特性,我们便只能对栈顶元素进行出栈操作,不能随意的对其他元素进行出栈操作。出栈函数非常简单,首先是扩容部分,如果数组内存不够,便对其进行扩容操作。然后在栈顶处,插入数据即可。

void PushST(ST* pst, STDatatype x)
{
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDatatype *tmp = (STDatatype*)realloc(pst->a, sizeof(STDatatype) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	//插入数据
	pst->a[pst->top] = x;
	pst->top++;

七、出栈

出栈操作,我们直接对pst->top进行–操作即可。但是,这里需要注意的是当数组元素全部删除完毕之后,便不能对其进行删除操作了,所以这里需要对其进行判空。

oid PopST(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	pst->top--;
}

八、判空

直接判断pst->top是否等于0,如果pst->top等于0则返回true,否则返回false。

bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;
}

九、获取栈顶元素

这里需要注意的是由于我们定义的是pst->top=0,即表示的是栈顶元素的下一个位置,所以当我们想要获取栈顶元素时,我们需要对其进行==-1操作==,返回栈顶元素。

//获取栈顶元素
STDatatype TopST(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	return pst->a[pst->top-1];
}

十、获取栈的size

直接将pst->top进行返回操作。

//获取栈的size
int STSize(ST* pst)
{
	assert(pst);
	return pst->top;
}

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

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

相关文章

【数据分享】全国1-5级流域、河流矢量数据与水体分布、五级水系数据、八级水系边界范围矢量数据

全国3级流域及各级河流数据:今天给大家分享的数据主要为五个,分别为3级流域、1级河流数据、3级以上河流数据以及4级和5级的河流数据。其中1级河流和3级以上河流数据中存在线状矢量以及面状的湖泊数据;4级和5级的河流数据仅为线状的河流矢量数据。数据中大…

Mysql 8.0主从复制模式安装(兼容Mysql 5.7)

Mysql V8.0.35安装 官网地址:MySQL :: Download MySQL Community Server 下载【Mysql 8.0.35】压缩包 解压压缩包,仅保留6个安装文件即可 mysql-community-client-8.0.31-1.el7.x86_64.rpm mysql-community-client-plugins-8.0.31-1.el7.x86_64.rpm my…

一文带你拿下MySQL之增删查改(基础)

✏️✏️✏️今天给各位带来的是关于数据库增删查改基础方面的知识。 清风的CSDN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! 动动你们发财的小手&#xf…

消息中间件——RabbitMQ(三)理解RabbitMQ核心概念和AMQP协议!

前言 本章学习,我们可以了解到以下知识点: 互联网大厂为什么选择RabbitMQ?RabbiMQ的高性能之道是如何做到的?什么是AMQP高级协议?AMQP核心概念是什么?RabbitMQ整体架构模型是什么样子的?Rabbi…

[译]JavaScript中Base64编码字符串的细节

本文作者为 360 奇舞团前端开发工程师 本文为翻译 原文标题:The nuances of base64 encoding strings in JavaScript 原文作者:Matt Joseph 原文链接:https://web.dev/articles/base64-encoding Base64编码和解码是一种常见的将二进制内容转…

【剪枝】torch-pruning的基本使用

论文:DepGraph: Towards Any Structural Pruning 工程:https://github.com/VainF/Torch-Pruning 算法和库的使用介绍:CVPR 2023 | DepGraph 通用结构化剪枝 1 TP的简介 该算法介绍了DepGraph 如何建模结构化剪枝中的层依赖,实现任…

redis的集群

高可用方案 1、持久化 2、高可用 主从复制 哨兵模式 集群 主从复制: 主从复制是redis实现高可用的基础,哨兵模式和集群都是在主从复制的基础之上实现高可用 主从复制实现数据的多机备份,以及读写分离(主服务器负责写,从服务器…

云HIS系统源码,医院管理系信息统源码,融合B/S版四级电子病历系统

医院管理信息系统是以推进公共卫生、医疗、医保、药品、财务监管信息化建设为着力点,整合资源,加强信息标准化和公共服务信息平台建设,逐步实现统一高效、互联互通的管理系统。 SaaS模式Java版云HIS系统,在公立二甲医院应用三年…

代餐粉产业分析:中国市场销售额增长至116.94亿元

近年来,随着人们生活节奏的加快和健康意识的增强,代餐粉市场规模逐渐壮大。在这个忙碌的时代,快捷、营养而又方便的代餐粉成为了许多人选择的首选。 随着健康理念的不断普及和推广,人们开始更加重视日常饮食的健康与营养。代餐粉作…

Vellum —— 简介

目录 一,介绍 二,原理 三,PBD算法 一,介绍 Vellum是一个解算模拟框架,使用更高级的PBD(XPBD,extended position based dynamics),是2nd Order Integration&#xff08…

Go 实现网络代理

使用 Go 语言开发网络代理服务可以通过以下步骤完成。这里,我们将使用 golang.org/x/net/proxy 包来创建一个简单的 SOCKS5 代理服务作为示例。 步骤 1. 安装 golang.org/x/net/proxy 包 使用以下命令安装 golang.org/x/net 包,该包包含 proxy 子包&am…

2023亿发数字化智能工单,专业管理工单处理全流程,助力企业转型腾飞

伴随着智能化和信息化的不断深入,企业数字化转型势如腾飞。在这个过程中,工单管理成为生产、家电、后勤等多个管理场景下频繁应用的关键环节。如何满足管理方对设备、服务等智能化管理的需求,提升工单管理效率、规范管理流程,并实…

问题:vue2+elementui,tabs切换显示表格并设置表格选中行高亮失败

错误示范: 1.直接setCurrentRow失败(this.currentRow是之前保存的表格当前选中行的数据) this.$refs.table.setCurrentRow(this.currentRow);2.以为是表格没生成就执行了setCurrentRow导致设置不成功,所以使用了this.$nextTick&…

英国国家量子计算中心与IBM签署重要协议!英国进入实用量子时代

​(图片来源:网络) 近日,英国国家量子计算中心(NQCC)与IBM达成了一项重要协议。根据该协议,NQCC将为英国研究人员提供IBM量子高级计划的云访问权限,其中包括IBM的量子计算系统舰队。…

SpringBoot Admin

前言 Spring Boot Admin 是一个管理和监控 Spring Boot 应用程序的开源项目,它提供了一个简洁的 Web 界面来监控 Spring Boot 应用程序的状态和各种运行时指标。Spring Boot Admin 可以帮助开发者快速了解应用程序的状态,并快速定位错误或性能问题。下面…

赛氪荣幸受邀参与中国联合国采购促进会第五次会员代表大会

11 月21 日 (星期二) 下午14:00,在北京市朝阳区定福庄东街1号中国传媒大学,赛氪荣幸参与中国联合国采购促进会第五次会员代表大会。 2022年以来,联合国采购杯全国大学生英语大赛已经走上了国际舞台,共有来自…

HC32L110小华半导体SWD模式切换的问题

在将SWD配置为普通引脚并配置为输出后,如果需要重新配置为SWD,需要将其配置为输入才行,如下: Clk_SetFunc(ClkFuncSwdPinIOEn, TRUE); //配置SWD引脚为普通引脚模式 Gpio_InitIOExt(SWCLK_PORT, SWCLK_PIN, GpioDirOut, TRUE,…

垃圾收集器的种类及概述

1.JVM参数 1.1标准参数所有jdk版本通用参数 -version -help -server -cp 1.2-X参数 非标准参数,也就是在JDK各个版本中可能会变动 -Xint 解释执行 -Xcomp 第一次使用就编译成本地代码 -Xmixed 混合模式,JVM自己来决定 1.3 -XX参数 使用得最多…

一个测试驱动的Spring Boot应用程序开发

文章目录 系统任务用户故事搭建开发环境Web应用的框架Spring Boot 自动配置三层架构领域建模域定义与领域驱动设计领域类 业务逻辑功能随机的Challenge验证 表示层RESTSpring Boot和REST API设计API第一个控制器序列化的工作方式使用Spring Boot测试控制器 小结 这里采用面向需…

悄悄上线:CSS @starting-style 新规则

最近 Chrome 117,CSS 又悄悄推出了一个新的的规则,叫做starting-style。从名称上来看,表示定义初始样式。那么,具体是做什么的?有什么用?一起了解一下吧 一、快速了解 starting-style 通常做一个动画效果…