【数据结构】栈的详解

栈的基本操作(出栈、入栈、销毁... 可以类比一个“羽毛球筒”,最先进入的羽毛球,必须等待,其他球取出,才能出来。第一种,top = 0,则栈顶元素在 top - 1 的位置。空间开辟的规则,一般遵循,一开始开辟四个单位。第二种,top = -1,则栈顶元素在 top 的位置。使用完毕后,也必须使用free函数,释放掉。需要对栈的空间进行扩容,使用realloc函数。,其只允许在固定的一端进行插入和删除元素操作。后面扩容时,扩增为原来的2倍。创建栈的结构体,包括栈的基本信息,本篇文章就到此结束啦!以下就是全篇汇总啦~ 阅读详情

☃️个人主页:fighting小泽
🌸作者简介:目前正在学习C语言和数据结构
🌼博客专栏:数据结构
🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻

1.栈

1.1栈的概念及结构

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

我们的顺序表链表的作用就是单纯的增删查改数据,但是栈除了存储数据还有一个后进先出的性质。

假如说我们要在栈中存储1、2、3、4,那么它们就会依次入栈,1在栈底,4在栈顶
在这里插入图片描述
但是当我们想出栈的时候是不是只能4、3、2、1呢?
其实不是的,我们可以入一个元素出一个元素,也可以入一个出两个,总之按自己的需求来定,但也要确保出栈顺序正确。
在这里插入图片描述
我们来看两个题:

  1. 一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出
    栈的顺序是( )。
    A 12345ABCDE
    B EDCBA54321
    C ABCDE12345
    D 54321EDCBA
  2. 若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
    A 1,4,3,2
    B 2,3,4,1
    C 3,1,4,2
    D 3,4,2,1

大家可以仔细想一想哦
在这里插入图片描述
在这里插入图片描述

1.2栈的实现

我们实现栈可以用两种方式,一种是通过顺序表来实现,一种是通过链表来实现。哪种方式好呢?

  • 在前面线性表的学习中我们知道,顺序表的优点是尾插尾删很方便,但是链表想要尾插尾删还要遍历一遍链表,效率就会很低。
  • 顺序表虽然存在空间不足问题,需要不断扩容。但是扩容的代价很低,而且到后面扩的会越来越慢

这样想一想用顺序表来实现栈是不是更好一些。

如果想用链表来实现栈,可以用链表尾当栈底,链表头当栈顶。插入删除数据就进行头插头删,感兴趣的朋友可以试一试。
在这里插入图片描述

栈的结构体的定义

栈的结构体其实和顺序表差不多,一个动态开辟的数组,一个栈的容量。

  • 注意 top 我们要决定它指向栈顶还是栈顶的下一个元素。如果top初始化为0,则它指向栈顶的下一个元素。如果top初始化为-1,则它指向栈顶元素。
  • 我比较喜欢初始化为0,1是top还可以表示元素的个数,可以用来判断栈是否满了。2是插入元素的时候直接在top的位置插入就行,然后再top++即可。

这里根据大家喜好设定就行。

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

Stack.h

#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#include<stdio.h>


typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

void STInit(ST* pst);//初始化栈

void STDestroy(ST* pst);//销毁栈

void STPush(ST* pst, STDataType x);//栈顶插入元素

void STPop(ST* pst);//栈顶删除元素

STDataType STTop(ST* pst);//获得栈顶元素

bool STEmpty(ST* pst);//判断栈是否为空

int STSize(ST* pst);//获得栈的元素个数

Stack.c

1.初始化栈和销毁栈

初始化的时候要注意参数传的是形参,要用assert判断一下。
初始化时我们可以先给栈开辟一些空间,也可以不开辟,等到要插入数据时再开辟。

void STInit(ST* pst)
{
	assert(pst);

	pst->a = NULL;
	pst->top = 0;
	pst->capacity = 0;
}

对栈进行销毁,我们只需要把动态开辟的空间a给释放置空了,把其它数据置为0即可。


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

2.栈顶插入元素

首先我们要判断栈是否满了,若栈的容量为0,则开辟一部分空间。若栈的空间满了,就将栈的空间扩大二倍。
如果栈没满,我们可以直接在top位置插入我们想插入的元素,然后top++即可。

void STPush(ST* pst, STDataType x)
{
	assert(pst);

	if (pst->capacity == pst->top)
	{
		pst->capacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;
		pst->a = (STDataType*)realloc(pst->a,sizeof(STDataType) * pst->capacity);
	}
	pst->a[pst->top] = x;
	pst->top++;
}

3.栈顶删除元素

删除元素的话,我们直接让top 减一即可。
注意当top为0,即没有元素的时候我们就不能再减下去了,不然会访问到不属于我们的空间。所以我们可以用一个STEmpty函数判断栈是否为空。

void STPop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	pst->top--;
}

如果栈为空,就返回真。如果栈不为空,就返回假

bool STEmpty(ST* pst)
{
	assert(pst);

	return pst->top == 0;
}

4.获得栈顶元素和元素个数

我们直接返回栈顶的前一个元素即可。
注意:若栈为空,则不能获得栈的元素。所以要判断栈是否为空。

STDataType STTop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	return pst->a[pst->top - 1];
}

直接返回栈顶的下标即可。之所以写这个函数,是因为别人不知道我们的top指向栈顶还是栈顶的下一个元素。所以直接让别人用就完了。

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

	return pst->top;
}

5.结尾

这些就是我给大家分享的关于栈的知识啦,是不是很简单啊。希望我们都能有所收获!
先赞后看,养成习惯!!^ _ ^
码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘了关注我哦!

如有错误,还请您批评改正(。ì _ í。)

【数据结构】栈的知识点总结--关于栈的定义和基本操作;C语言实现栈;顺序栈;链栈;共享栈;栈的易错点的总结 关于栈的定义和基本操作;C语言实现栈;顺序栈;链栈;共享栈;栈的易错点的总结 阅读详情

相关推荐

suse ha for sap scale-up性能优化场景安装配置

suse ha for SAP安装配置

jetliu05的博客 2127

数据结构:栈「详解」

栈(Stack)是一种常见的数据结构,它是一种“后进先出”(Last In First Out,LIFO)的数据结构。栈可以看做是一种特殊的线性表,只能在栈顶进行插入和删除操作。栈顶是允许操作的,而栈底是固定的。

weixin_56433857的博客 1万+

创新实训项目博客:基于LoRA的医疗大模型高效微调实战

预训练大语言模型(LLMs)虽然具备了广泛的知识和一定的通用能力,但在特定领域(如医疗)或特定任务(如遵循特定指令格式进行思考链推理)上,其表现往往不尽如人意。微调(Fine-tuning)能够使模型学习到特定领域的数据分布和任务模式,从而在目标任务上获得更好的性能,使其更贴合实际应用需求。使用Unsloth框架加载并以4-bit量化模型。基于数据集,构建了包含明确思考链引导的训练Prompt。配置了LoRA参数,并使用SFTTrainer在单张T4 GPU上对模型进行了高效微调。

m0_73556916的博客 1285

数据结构之——栈

数据结构之——栈 一:栈的定义: 栈是限定是限定仅在表位进行插入和删除操作的线性表,栈又称为先进后出(Last In First Out)的线性表,简称LIFO结构。 栈顶:允许插入和删除的一端称为栈顶。 栈底:不可以进行插入和删除操作。 空栈:不含任何数据元素的栈称为空栈。 理解栈的定义需要注意几点: 1:它是一个线性表,即说明栈元素具有 线性关系,即 前驱后继 关系。只不 过它是一种特殊的线性表而已。 2:定义中说在线性表的表的表尾进行插入和删除操作,注意这里表尾指的是

WenJieya的博客 7497

14自由度汽车动力学模型

多体系统分解簧上质量刚体:包含车身主体,具有6个自由度(x/y/z平移 + 俯仰/侧倾/横摆旋转)四个簧下质量刚体:每个车轮独立建模,含垂直跳动(z向)和旋转(绕z轴)自由度总自由度:6(车身) + 4×2(车轮) = 14自由度。

chao189844的博客 1189

NX二次开发点通过云配准获取相同体

先找到体的参考方向(这个参考方向对于相同体重合之后是相同的),这个时候我们的思路是三个不共线的点确定一个坐标系,然后和绝对方向求转换矩阵。然后获取体的所有边的几何中心,把这些点通过转换矩阵转换之后存起来,再和另外一个体转换之后的点数据作对比,在误差范围内配对点的数量等于体获取点的数量就是相同体

qq_39541524的博客 1639

栈——栈的定义及基本操作(初始化、判空、进栈、出栈、遍历栈、销毁栈等)

文章目录栈的定义栈的存储栈上的基本操作初始化判空操作进栈操作出栈操作读栈顶元素遍历栈销毁栈完整代码及实例共享栈 栈的定义 栈(Stack)是只允许在一端进行插入或删除操作的线性表。 栈的示意图: 栈顶Top:线性表允许插入和删除的那一端。 栈底Bottom:固定的,不允许进行插入和删除的另一端。  假设某个栈S={a1,a2, … ,an},如上图所示,则a1为栈底元素,an为栈顶元素。由于只能在栈顶进行插入和删除操作,故进栈顺序为a1,a2, … ,an,出栈顺序为an, … ,a2,a1。故栈的操

薛定谔的猫的博客 9万+

R3LIVE项目实战(3) —双目相机与激光雷达 lidar_camera_calib联合标定

lidar_camera_calib是一个在无目标环境中,用于高分辨率LiDAR(例如Livox)和摄像机之间准确的外部标定工具。我们的算法可以在室内和室外场景中运行,并且只需要场景中的边缘信息。如果场景适合,我们可以实现类似于或甚至超过基于目标的方法的像素级准确度。我们使用标定的外部参数给点云上色,并与实际图像进行比较。A和C是点云的局部放大视图。B和D是与A和C中的点云对应的摄像机图像的部分。

几度春风里的博客 4049

数据结构——栈的详解

栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和线性表大不相同的两类重要的的抽象数据类型。 C语言和C++中的栈C语言中的栈栈的定义C语言中栈的基本操作栈的初始化判断是否为空栈判断是否为满栈入栈出栈C语言实现栈的具体代码C++中的栈C++中栈的基...

晴空๓ 8万+

YOLOv10精度上不去?QAT量化感知训练全流程,INT8推理mAP只掉0.8%

普通PTQ量化虽简单,但无法应对YOLOv10的小目标特征和激活分布波动,导致精度暴跌。QAT通过“模拟量化误差+联合优化权重与量化参数”,让INT8模型精度接近FP16,同时速度提升1.8倍,完美适配实时检测场景(如安防监控、自动驾驶)。该流程已在工业级项目中验证,针对YOLOv10的优化策略(敏感层保护、小目标加权、分阶段训练)可直接迁移至其他YOLO系列(v8/v9),量化后精度损失均可控制在1%以内。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 913

uniapp | vue2 | vue3 - 解决调用天地图功能服务时 http 网络请求报错 net::ERR ABORTED 503(Service Temporarily Unavailabl)

vue,uni-app,天地图,请求报错,503,请求失败,map.tianditu,天地图503,天地图请求503,接口503错误怎么办,vue天地图,uniAPP天地图,获取定位接口服务器报错503,获取当前定位,定位功能,IP属地定位,天地图服务器报错,如何解决报错,net::ERRABORTED503(ServiceTemporarilyUnavailabl),GET,POST,服务暂时不可用,react天地图,一直等待吗,报错怎么办,定位报错,轨迹,经纬度,天地图服务器503,在vue2

🏆 前端领域优质创作者 4435

数据结构之栈详解

目录 栈 栈的应用 栈的实现 栈的时间复杂度 栈的应用 使用栈解决有效的括号问题(LeetCode第二十号问题) 栈 栈也是一种数据结构 相比数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从一端取出元素 这一端称为栈顶 栈是一种后进先出的数据结构 Last In First Out(LIFO) 在计算机的世界里,栈拥有着不可思议的作用 栈的应用 ...

万物并作,吾以观复 646

SAP-ABAP:字符与数值类型转换详细指南

SAP-ABAP:字符与数值类型转换详细指南

baidu_35680696的博客 1465

【数据结构】详解栈

对栈模糊?一键带你吃透!

小八哥 2580

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数据结构与算法—栈详解

目录什么是栈设计与介绍数组实现结构设计push插入s 什么是栈 百度百科上,栈是这么定义的: 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素...

bigsai 7929

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

[详解栈和队列]数据结构之栈与队列

✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆 📃个人主页:Philosophy7的csdn博客 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博>主哦🤞 文章目录栈和队列1.物理结构和逻辑结构2.什么是栈2.1栈的基本操作3.什么是队列队列的基本操作小结 栈和队列 1.物理结构和逻辑结构 再了解栈和队列之前,我们要先知道什么是逻辑结构和物理结构。 逻辑结构: 按照逻辑结构划分:数据结.

Philosophy7的博客 4194

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构之动态栈、静态栈详解

定义: 栈是只能在一端进行数据的插入与删除的线性表。也可以理解为一种“先进后出”的存储结构。 按照内存生成的方式不同分为: 静态栈 动态栈 栈的几个概念: 允许进行插入、删除操作的一端称为栈顶。 表的另一端称为栈底。 当栈中没有数据元素时,称为空栈。 栈的插入操作通常称为进栈或入栈。 栈的删除操作通常称为退栈或出栈。 静态栈的代码如下: 1.静态栈 不用malloc函数 /* 生成...

理工大的小哥哥 2783

【数据结构】栈详解

本文介绍了栈的基本概念、实现方式及具体操作。栈是一种遵循LIFO原则的线性结构,支持压栈和出栈操作。实现方式主要有数组栈(推荐)和链式栈两种,前者具有更高的缓存利用率和操作效率。文章详细讲解了动态栈的实现,包括初始化、销毁、判空、入栈、出栈、获取栈顶元素和计算栈大小等核心功能,并提供了完整的C语言代码示例。重点分析了数组栈的扩容机制和top指针的两种不同定义方式对操作的影响。

2301_79989168的博客 760

【数据结构】栈和队列详解

栈和队列详解!!!

2403_86779341的博客 1382

数据结构之栈的详解

栈是一种先入后出(FILO)的线性表数据结构添加和删除操作只在表的一端进行,这一端称为栈顶,另一端称为栈底添加操作又称入栈或进栈,删除操作又称出栈例如手枪的弹夹就是诸如此类的结构我这里做出简单的一个解释,简单来说就是后缀表达式,我这里做出一个简单的图示定义一个栈,用于存储操作数。遍历字符串数组tokens中的每个元素。如果当前元素不是运算符,则直接将其PARSE为整数并压入栈。如果当前元素是运算符,则弹出栈顶的两个操作数进行运算。根据运算符不同,进行加减乘除运算。将结果压入栈。

qq_45726327的博客 1856

数据结构——栈详解

栈(Stack)是一种线性存储结构,它具有如下特点: (1)栈中的数据元素遵守“先进后出"(First In Last Out)的原则,简称FILO结构。(后进先出的叫法,也是可以的) (2)限定只能在栈顶进行插入和删除操作。 2、栈的相关概念: (1)栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。 (2)压栈:栈的插入操作,叫做进栈,也称压栈、入栈。 (3)弹栈:栈的删除操作,也叫做出栈。...

m0_54615144的博客 3242

栈 C++详解(数据结构)

详解一 像数组或链表一样,栈也是一种数据结构,它包含一系列元素。 但是,与数组和链表不同的是,栈是一个后进先出(LIFO)的结构,这意味着当一个程序从栈中检索元素时,插入到栈中的最后一个元素是第一个被检索的元素(同样,插入的第一个元素是最后一个被检索的元素)。 在想象一个栈的工作方式时,可以想象一下餐厅流水线开始时的一堆盘子。当餐厅的工作人员补充餐盘时,他或她放入的第一个盘子将是最后一个被取走的,如图 1 所示。 图 1 栈的后进先出方式就像餐厅盘子的取用方式 餐厅中一堆盘子的LIF.

m0_61067261的博客 6480
上一篇: 【数据结构】带头双向循环链表的实现
下一篇: 【数据结构】队列详解
fighting小泽
博客等级 码龄5年 612粉丝 28原创
评论 37
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值