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

news2024/12/27 17:41:38

数据结构——栈

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

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

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

相关文章

什么台灯最好学生晚上用?专业的学生台灯分享

大家都知道现在的孩子学习压力都很重,尤其是年级越高的孩子,作业、学习任务也就越重!如今的孩子夜晚学习似乎成为了一件再常见不过的事情,不过晚上单靠一盏室内灯的光线是肯定不够的,还需要搭配一台书桌台灯一起使用&a…

OpenLayers实战,WebGL图层根据Feature要素的变量动态渲染多种颜色和不同直径大小的圆形和圆点图形,适用于大量圆形圆点渲染不同颜色不同大小

专栏目录: OpenLayers实战进阶专栏目录 前言 本章使用OpenLayers根据Feature要素的变量动态渲染不同颜色和不同直径大小的圆形和圆点图形。 通过一个WebGL图层生成四种不同颜色和不同大小的圆形圆点图形要素,适用于WebGL图层需要根据大量点要素区分颜色区分不同大小显示圆形…

机器人算法—ROS TF坐标变换

1.TF基本概念 (1)什么是TF? TF是Transformations Frames的缩写。在ROS中,是一个工具包,提供了坐标转换等方面的功能。 tf工具包,底层实现采用的是一种树状数据结构,根据时间缓冲并维护多个参考…

使用ExLlamaV2量化并运行EXL2模型

量化大型语言模型(llm)是减少这些模型大小和加快推理速度的最流行的方法。在这些技术中,GPTQ在gpu上提供了惊人的性能。与非量化模型相比,该方法使用的VRAM几乎减少了3倍,同时提供了相似的精度水平和更快的生成速度。 ExLlamaV2是一个旨在从…

Day27|Leetcode 39. 组合总和 Leetcode 40. 组合总和 II Leetcode131. 分割回文串

Leetcode 39. 组合总和 题目链接 39 组合总和 本题目和前面的组合问题差不多,只不过这里能重复选取数字,还是要注意组合的定义,交换数字顺序还是算一个组合,所以这里还是用我们的startIndex来记录取的数字到哪里了,下…

在Linux服务器中查找mysql的配置文件并修改其内容并保存,清空mysql8.0以上默认开启SSL的配置,防止odbc无法连接的问题

------每个命令输完记得按【enter】回车键------- 1、查找mysql的配置文件命令-mysql的配置文件默认名是my.cnf: find / -name my.cnf 2、查看显示的配置文件内容: cat /etc/my.cnf 3、修改配置文件的内容: 使用vi 或vim 命令 vi /etc…

opencv-Canny 边缘检测

Canny边缘检测是一种经典的图像边缘检测算法,它在图像中找到强度梯度的变化,从而识别出图像中的边缘。Canny边缘检测的优点包括高灵敏度和低误检率。 在OpenCV中,cv2.Canny() 函数用于执行Canny边缘检测。 基本语法如下: edges…

开始通过 Amazon SageMaker JumpStart 在亚马逊云科技上使用生成式 AI

目前,生成式 AI 正受到公众的广泛关注,人们围绕着许多人工智能技术展开讨论。很多客户一直在询问有关亚马逊云科技生成式 AI 解决方案的更多信息,本文将为您进行解答。 这篇文章通过一个真实的客户使用案例概述了生成式 AI,提供了…

CSS特效015:7个小球转圈圈加载效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

Redis篇---第十三篇

系列文章目录 文章目录 系列文章目录前言一、redis的过期策略以及内存淘汰机制二、Redis 为什么是单线程的三、Redis 常见性能问题和解决方案?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看…

bootstarp+springboot基于Java的教学仪器设备商城销售网站_o9b00

1、商品分类功能 商品分类是教学仪器设备销售网站中十分重要的一部分,它能够提高用户在网站上的浏览速度,并方便用户快速找到自己需要的商品。因此,需要对该功能进行分析和设计,确保其体验性、可用性和易用性。可以将商品分为多个…

最护眼的灯是白炽灯吗?专业的护眼台灯推荐

以前科技发展落后,晚上需要照明时也只有白炽灯可以使用,这也是迫不得已的事情。白炽灯最大的优点就是成本便宜,而且显色比较接近自然光。不过缺点也有着不少,例如:光线分布不均匀、刺眼、能耗高、寿命短等等。 如今时…

Docker Swarm总结

1、swarm 理论基础 1.1 简介 Docker Swarm 是由 Docker 公司推出的 Docker 的原生集群管理系统,它将一个 Docker 主机池变成了一个单独的虚拟主机,用户只需通过简单的 API 即可实现与 Docker 集群的通 信。Docker Swarm 使用 GO 语言开发。从 Docker 1.…

ssm+vue的药店药品信息管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的药店药品信息管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结…

HTML+CSS+ElementUI搭建个人博客静态页面展示(纯前端)

网站演示 搭建过程 技术选取 HTML/CSSVUE2ElementUI(Version - 2.15.14) 环境配置与搭建 安装指令 1. 先确保你的电脑已经安装好了npm和node npm -vnode -v2. ElementUI下载&#xff0c;推荐使用 npm 的方式安装 npm i element-ui -S3. CDN引入 <!-- 引入样式 --> <…

C语言——用递归函数计算n!

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 比别人多一点努力&#xff0c;你…

Python精讲 | 超好用的f-string和Python3.12的新增特性

大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 上个月&#xff0c;Python发布了3.12版本&#xff0c;新增了一些特性&#xff0c;并且提升了效率。这个在之前文章中有提过&#xff1a;Python3.12发布,性能提升5% 新增特性之一&#xff0c;就是扩展了f-string的语…

【教3妹学编程-算法题】最大异或乘积

3妹&#xff1a;2哥&#xff0c;你有没有看到新闻“18岁父亲为4岁儿子落户现身亲子鉴定” 2哥 : 啥&#xff1f;18岁就当爹啦&#xff1f; 3妹&#xff1a;确切的说是14岁好吧。 2哥 : 哎&#xff0c;想我30了&#xff0c; 还是个单身狗。 3妹&#xff1a;别急啊&#xff0c; 2…

代码随想录第六十三天 | 单调栈:寻找 左边 / 右边 距离当前元素最近的 更小 元素的 下标(暴力,双指针,单调栈)(84);代码随想录主要题目结束

1、寻找 左边 / 右边 距离当前元素最近的 更小 元素的 下标 1.1 leetcode 84&#xff1a;柱状图中最大的矩形 第一遍代码思路错了&#xff0c;如&#xff1a;输入[2,1,2]&#xff0c;对于2&#xff0c;因为比栈顶元素1大&#xff0c;然后就会直接得出2&#xff08;1&#xff…