数据结构之栈

<数据结构>——栈 📚参考资料:《数据结构C语言版》-严蔚敏 一、栈 首先,我们了解一下什么是栈? 栈是限定仅在表尾进行插入或删除操作的线性表。 表尾为栈顶,表头为栈底,不含元素的空表称为空栈。 例如, 洗干净的盘子总是逐个往上叠放在已经洗好的盘子上面 , 而用时从上往下逐个取用 还有一些案例也利用了栈: 括号的检验 我们来看这些括号,给它们标号为1-4,当出现1和2时,我们更想要先出现3,再出现4。而由于1与3配对,2与4配对,所以我们其实对于2的需求感强于对1的需求感。 1先进... 阅读详情

栈的定义

栈(stack)是限定于在表尾进行插入和删除操作的线性表
可以理解为后进先出,先进后出的数据结构

栈的基本操作

1.Push
将数据压入栈中,压出的数据成为新的栈顶
2.Pop
获取栈顶数据,并释放,原栈顶后一个元素成为新栈顶



栈的分类

1.顺序存储结构栈

用一段内存作为栈的存储空间,top指向栈顶元素的下标

2.共享空间栈

两个类型的栈共享一段内存,适用于此消彼长型的数据情况。top1指向栈1的栈顶,top2指向栈2的栈顶,当top1与top2碰头则栈空间不足。

3.链栈

     就是一个只允许在线性链表表头插入删除的线性链表top为指向链表节点的指针。
C实现

1.顺序结构栈

栈结构为
typedef struct item//普通栈
{
	int buffer[MAX_SIZE];//这个其实可以动态分配
	int top=-1;
}Stack;
MAX_SIZE为一个宏定义

Push操作
bool Push(Stack *L,int *arry,int lenth)
{
	if (MAX_SIZE - L->top - 1<lenth)return 0;//看空间是否足够
	for (int i = 0; i < lenth; i++)
	{
		L->top++;
		L->buffer[L->top] = arry[i];
	}
	return 1;
}

该操作允许向栈中压入一组数据,会进行对栈空间进行计算,如果栈空间不够(MAX_SIZE-L->top-1)则返回0,压入成功返回1

Pop操作
bool Pop(Stack *L, int *e)
{
	if (L->top == -1)return 0;
	*e = L->buffer[L->top];
	L->top--;
	return 1;
}
弹出操作会先判断栈中是否有数据即栈顶知否指向-1,如果是则表示栈为空返回0,否则返回栈顶数据。

因为插入与弹出操作均未涉及到循环所以其时间复杂度为O(1)

2.共享空间栈

栈结构:
typedef struct date//共享空间栈
{
	int buffer[MAX_SIZE];
	int top1=-1;
	int top2=MAX_SIZE;
}SqlStack;

top1指向数组的底部  top2指向数据的顶部 MAX_SIZE依然是对数组长度的宏定义

Push操作
bool Push(SqlStack *L,int *arry,int lenth,int Stacknum)//适用于两栈共享
{
	if (L->top1 + lenth > L->top2)return 0;//没有存储空间了
	if (Stacknum == 1)
	{
		for (int i = 0; i < lenth; i++)
		{
			L->top1++;
			L->buffer[L->top1] = arry[i];
		}
	}
	else if (Stacknum == 2)
	{
		for (int i = 0; i < lenth; i++)
		{
			L->top2--;
			L->buffer[L->top2] = arry[i];
		}
	}
	else return 0;
	return 1;
}
该操作依然允许压入一组数据,并且需要指出压入栈1或者压入栈2,当top1与top2碰面则表示该栈空间已不足返回0,否则完成操作后返回1


Pop操作
bool Pop(SqlStack *L,int *date,int Stacknum)
{
	if (L->top1 == -1 && L->top2 == MAX_SIZE)return 0;//栈中没有数据
	if (Stacknum == 1)
	{
		*date = L->buffer[L->top1];
		L->top1--;
	}
	else if (Stacknum == 2)
	{
		*date = L->buffer[L->top2];
		L->top2++;
	}
	else return 0;
	return 1;
}

弹出栈顶元素的数据,这里判断空栈的方式是top1=-1并且top2=MAX_SIZE


3.链栈

数据结构:
节点:
typedef struct obj
{
	int num = 0;
	obj*next = NULL;
}StackNode,*LinkStackPtr;


栈结构:
typedef struct element
{
	LinkStackPtr top=NULL;
	int count;
}LinkStack;//链栈

Push操作:
bool Push(LinkStack *L,int date)//新加入的元素会在顶部
{
	LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
	s->num = date;
	s->next = L->top;
	L->top = s;
	L->count++;
	return 1;
}

该操作会先创建一个链节点s为其分配存储空间 s的向后指针next指向栈顶之后栈顶指针指向s,此时操作结束top指向s,s指向栈原栈顶元素
Pop操作:
bool Pop(LinkStack *L,StackNode *e)
{
	LinkStackPtr ptr;
	if (L->top==NULL)return 0;
	e->num = L->top->num;
	ptr = L->top;
	L->top = L->top->next;
	free(ptr);
	L->count--;
	return 1;
}
该操作依然会先对链栈进行判断是否是空链栈,判断方式可以是判断count的值,也可以判断top指针是否为空
copy一个节点元素并将其复制给e所在地址的元素返回。

倾向得分匹配的stata命令_政策评估方法引荐|广义倾向得分匹配(GPSM) 和大家分享一下最近学习的进展,在痛苦读完stata journal和练习OA程序,已经可以基本完成广义倾向得分的估计了,在国内这一方法还没有形成广泛运用,因此学习资源也是有点稀缺的,在文章最后给各位提供数据和代码以供练习。有问题可以随时文末留言或者联系我哦。人文社会科学中一般无法在实验室中控制样本个体的特征,我们一般采用“准自然实验”的研究路径,也就是不随机安排样本接受处理与否。但放弃随机分组假定... 阅读详情

相关推荐

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 807

【数据结构】栈是什么?从0理解栈的数据结构

在数据结构的学习中,栈是一种非常重要的结构。无论你是否是计算机专业,栈的概念其实并不复杂。本篇文章将帮助你从零理解栈的数据结构,了解它的基本用途、实际应用以及如何在C++中实现栈操作。

XuanRan的博客 4543

CTFshow-pwn入门-前置基础pwn32-pwn34

CTFshow-pwn入门-前置基础pwn32-pwn34

你们de4月天的博客 1131

【数据结构】栈的详解

栈的结构体其实和顺序表差不多,一个动态开辟的数组,一个栈的容量。注意 top 我们要决定它指向栈顶还是栈顶的下一个元素。如果top初始化为0,则它指向栈顶的下一个元素。如果top初始化为-1,则它指向栈顶元素。我比较喜欢初始化为0,1是top还可以表示元素的个数,可以用来判断栈是否满了。2是插入元素的时候直接在top的位置插入就行,然后再top++即可。这里根据大家喜好设定就行。int top;} ST;

fighting小泽的博客 3433

用python将dycom .dcm格式图像转换为nifti .nii

因为发现目前搜索到的多数中文教程并不能正确将FMRI图像正确转换,例如很多用simpleITk的seriesreader的,所以写了一下自己正确转换的方法。因为FMRI是一个4D数据,有时间轴,所以用seriesreader读写出来的图像把时间轴维度给降维了。当然你用SPM12工具的dycom import也是能正确转换的,但是我还是喜欢python这样的,代码直接简单。

qq_41103479的博客 3609

自动化测试-自愈技术

随着人工智能的发展,作为一名软件测试工程师,相信大家都会思考如何把这一前沿技术引入到我们的自动化测试当中,想一万遍不如做一遍。,传递当前页面状态,获取之前成功的定位器路径,比较它们,并生成修复的定位器列表。如果修复成功,我们可以使用 Healenium Idea 插件更新我们的自动化测试代码:插件使用修复定位器寻找修复和更新测试代码。的旧定位器去定位按钮的时候,脚本就会报错,提示 “NoSuchElement”的错误异常。现在,我们假设开发人员变更了应用程序的UI界面,改变了这个按钮的id属性,从。

qq_58223744的博客 2660

数据结构 栈

摘要 栈是一种后进先出(LIFO)的线性数据结构,仅允许在栈顶进行插入(push)和删除(pop)操作。其核心特性包括:仅操作栈顶、不支持随机访问、默认基于deque实现。栈的提出源于1950年代鲍尔团队对逆波兰表达式计算和函数调用机制的研究,现广泛应用于程序调用栈、表达式求值、括号匹配等场景。C++中可通过STL的std::stack或手动数组实现栈操作,基本功能包括压栈、弹栈、判空等。例题B3758展示了栈在括号匹配中的典型应用——通过栈统计未匹配括号数量,动态补全成合法序列。栈的高效性使其成为算法和系

syshrgjdkdh的博客 2237

开源数显表

开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文

m0_70934529的博客 435

数据结构——————栈

栈(Stack)是一种特殊的线性数据结构,其插入和删除操作都只允许在表的一端进行。这一端被称为栈顶(top),另一端则被称为栈底(bottom)。栈遵循后进先出(Last In First Out,LIFO)的规则,即最后存入的元素将被最先取出。顺序栈采用一个数组存放栈中的元素。如果需要用到两个类型相同的栈,这时若为它们各自开辟一个数组空间,极有可能出现这样的情况:第一个栈已满,再进栈就溢出了,而另一个栈还有很多空闲的存储空间。解决这个问题的方法是。

m0_66847953的博客 1381

内网环境下的高德地图离线化实战:从瓦片下载到交互功能集成

本文详细介绍了在内网环境中部署离线高德地图的完整实战方案。针对军工、能源、金融等对网络隔离与数据安全有严格要求的场景,文章核心解决了离线地图的两大基石:地图瓦片数据的高效下载与本地化,以及高德地图JS API的获取与插件集成。通过具体代码示例,进一步讲解了如何实现地图初始化、海量点标注与聚合、自定义图标及框选查询等核心交互功能,并分享了内网部署的路径配置、性能优化及法律合规等关键注意事项,为开发者在封闭网络环境下构建稳定、可控的地图应用提供了清晰指南。

Apple的专栏 394

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-差分信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的差分拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 440

数据结构之——栈

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

WenJieya的博客 7499

【Mode】Mode expansion monitors

对于宽带仿真,因为被支持的模式可能是波长的函数,因此,推荐在波长范围内增加频率的采样点数量去计算支持的波导模式分布或者光纤模式分布。对于宽带仿真,如果在被计算模式上的频率点的数量与通过 frequency-domain monitors 被测量的频率点的数量不匹配,这种情况是正常的。Mode expansion monitors 对于仿真偏振转换器是十分有用的,比如,在偏振转换器中,当你想要提取从输入模式到输出模式的转换效率,或者提取一个装置的 S 参数。给出了进入到被选择模式中的合透射率,

u011699626的博客 2760

栈—数据结构

6、获取栈顶元素(获取栈顶元素,在外面开一个空间,将该空间的地址传过去,进行获取元素,以便于区分元素还是返回值)入栈的方向是是增栈的方式,放入数据的是满栈的方式。入栈的方向是是减栈的方式,放入数据的是满栈的方式。入栈的方向是是增栈的方式,放入数据的是空栈的方式。入栈的方向是是减栈的方式,放入数据的是空栈的方式。3、出栈(看一下,出去的元素,所以和6一样)1、入栈:先放入输入,再移动栈顶指针。2、出栈:先移动栈顶指针,再数据弹出。1、入栈:先挪栈顶指针,再放入数据。2、出栈:先移出数据,再移动指针。

weixin_63722559的博客 1427

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据结构——栈

本文介绍了栈的基本概念和两种实现方式:顺序栈和链栈。主要操作包括压栈(插入)和出栈(删除)。顺序栈采用数组实现,具有高效尾部操作的优势;链栈则使用链表结构实现。最后通过一道有效的括号匹配算法题展示了栈的实际应用。理解栈的实现原理有助于掌握更复杂的数据结构,并为算法学习打下基础。

2401_88326089的博客 1119

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构-栈及栈的应用

栈的概述 栈式一种重要的线性结构,属于一种操作受限的线性表 栈(stack) 是限定尽在表尾进行插入或删除操作的线性表 表尾端称为栈顶(top),表头端称为栈底(bottom) 栈的元素先进后出(后进先出),即最先进入栈的元素最后出栈 ...

初始化的博客 5106

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【数据结构】栈

什么是栈?栈:一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈顶 栈底是什么,线性表又是什么?栈顶与栈底是不固定的,取决于你想在哪边操作。拿顺序表举例,若只在表尾增删,那表尾就是栈顶,相对的表头就是栈底。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据也在栈顶。因为栈一般是存储在堆上的,故栈的大小可以看作无穷大(取决于你的机器)。【数据结构】初阶——顺序表①为什么说栈是受限制的。

Kaisir777的博客 878

【数据结构】栈和队列——栈

本文介绍了栈和队列的基本概念与实现方式。主要内容包括: 栈的定义与特点:受限线性表,遵循先进后出(FILO)原则,仅允许在栈顶进行插入(push)和删除(pop)操作。 栈的存储结构:顺序栈(数组实现)和链式栈(链表实现),分析各自优缺点。 顺序栈的实现细节:包括静态和动态两种方式,重点说明栈顶指针的两种不同定义方式及其操作差异。 栈的基本操作:详细讲解入栈(Push)操作的实现逻辑,包括栈满判断、元素放置和指针更新等关键步骤。 文章通过代码示例展示了顺序栈的初始化、入栈和出栈操作,并特别强调了动态顺序栈的

m0_72516377的博客 962

栈数据结构

栈是一种先进后出的数据结构,可以分为:顺序栈和链式栈 一、顺序栈 1、其结构如下图所示: 2、栈的基本操作,只有如下的五个 push( ) 入栈 pop( ) 出栈 empty( ) 是否为空 top( ) 返回栈顶元素 size( ) 返回栈中元素个数 swap() 交换 #include<iostream> #include<stack> ...

Jeffxu_lib的博客 2448
上一篇: 最大子数组问题
下一篇: 数据结构之队列
shu_8708
博客等级 码龄10年 45粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值