数据结构与算法_栈

news2024/11/26 19:41:32

一、什么是栈

栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除的操作。

对数据进行插入和删除的一端叫做栈顶,另一端是栈底。

对栈的两项操作分别叫做入栈、出栈。

入栈就是对栈进行插入操作,除此之外,入栈也叫做进栈、压栈。

出栈就是对栈进行删除的操作。

不管是入栈的数据还是出栈的数据都在栈顶。

栈的元素数据遵循后进先出(Last In First Out)的原则,即后进入的数据先出来。

以下是栈以及栈的操作的一张示意图:

如果一组数据的入栈顺序为1234

那么它的出栈顺序可能为

4321

1234

2134

······

二、缓存利用率

栈可以用顺序表实现,也可以用链表来实现。

但是,顺序表的缓存利用率更高,链表的缓存利用率低于顺序表。

结构上来说顺序表物理上是连续的,链表是一个一个的节点。

众所周知计算机的存储体系是分级的,CPU的速度远远大于RAM的速度,所以在CPU和RAM之间会有三级的缓存和寄存器。

如果现在分别对顺序表和链表进行遍历访问或是修改数据,这时是CPU对这些数据进行访问,也就是说CPU要访问内存。

CPU要想对内存进行访问,会先去访问缓存,如果数据在缓存中就访问了数据。如果数据不在缓存中,那么内存中的数据会先进入缓存再供CPU访问。由于缓存大小有限,当数据量很大时,大概率不会一下将内存中的数据放入缓存。

那为什么这两种数据结构的缓存利用率不同呢?

就是因为,内存的数据在进入缓存时,不会只传递将要访问的数据,而是,会加载更多的数据。

假如现在最开始的数据都不在缓存,那么内存中的数据在加载到缓存中时,如图所示:

绿色的方框代表能被一次加载的数据可以看到,顺序表中的数据都成功加载到了缓存,而链表中的数据没有被完全加载到缓存中,要将链表中的数据完全加入到缓存中,还要再来。

因为顺序表的数据是物理连续存储的,而链表的数据是一个一个节点的存储的,它们不连续。

所以说顺序表的缓存利用率比链表的缓存利用率高。

三、栈的实现

那么,要实现栈是用顺序表好还是链表好?

可以用顺序表实现,但是要考虑扩容。也可以用链表来实现。

但是,在了解了顺序表和链表的缓存利用率后,我们也许会优先选择使用顺序表。

这里选择用顺序表实现栈。

定义栈以及栈的数据类型:

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

栈的初始化:

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

	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		return;
	}

	ps->capacity = 4;
	ps->top = 0;   // top是栈顶元素的下一个位置

	//ps->top = -1;   // top是栈顶元素位置
}

注意这里top可自定义,注释有说明。

入栈:

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

	if (ps->top == ps->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->a,
			sizeof(STDataType) * ps->capacity*2);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		ps->a = tmp;
		ps->capacity *= 2;
	}

	ps->a[ps->top] = x;
	ps->top++;
}

出栈:

void STPop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

	ps->top--;
}

栈的销毁:

void STDestroy(ST* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

栈的大小:

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

	return ps->top;
}

取栈顶元素:

STDataType STTop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

	return ps->a[ps->top - 1];
}

判断栈是否为空:

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

	return ps->top == 0;
}

如果是C语言实现要引用stdbool头文件。

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

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

相关文章

2023挖漏洞给报酬的网站汇总,兼职副业3天收益2000

一、众测平台(国内)二、前沿漏洞研究奖励计划三、行业SRC四、企业应急响应中心-SRC-汇总 1、互联网企业2、生活服务、住宿、购物相关企业3、物流、出行、旅游4、金融相关企业5、视频游戏直播社交娱乐6、教育、问答、知识付费7、泛科技通讯物联网云服务8、安全企业9、其他 一、…

渗透测试的八大步骤

渗透测试 其实很多安全漏洞都属于Web应用漏洞,这些Web漏洞可以通过渗透测试验证。渗透测试是利用模拟黑客攻击的方式,评估计算机网络系统安全性能的一种方法。这个过程是站在攻击者角度对系统的任何弱点、技术缺陷或漏洞进行主动分析,并且有…

【深度学习】Mini-Batch梯度下降法

Mini-Batch梯度下降法 在开始Mini-Batch算法开始之前,请确保你已经掌握梯度下降的最优化算法。 在训练神经网络时,使用向量化是加速训练速度的一个重要手段,它可以避免使用显式的for循环,并且调用经过大量优化的矩阵计算函数库。…

Vulnstack红队(一)

刚开始了解内网的时候做的,可能细节有问题的地方会比较多 0 - 环境配置 Vmware虚拟网络配置 三个靶机设置 Win7(添加一张网卡) VMnet1VMnet2Win2003 VMnet1Win2008 VMnet1 攻击机(kali)设置 VMnet2 网络拓扑 kali …

当电脑遇到msvcp110.dll丢失怎么办?最新解决方法分享

在使用电脑过程中,我们经常会遇到一些系统文件丢失的问题。其中,msvcp110.dll是Windows操作系统中的一个重要的动态链接库文件,它包含了许多与C运行库有关的函数和类。当系统中缺少或损坏这个文件时,可能会导致一些应用程序无法正…

细谈left join和join

👏作者简介:大家好,我是爱发博客的嗯哼,爱好Java的小菜鸟 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝社区论坛:希望大家能加入社区共同进步…

OpenCV 10(图像轮廓)

一、图像轮廓 图像轮廓是具有相同颜色或灰度的连续点的曲线. 轮廓在形状分析和物体的检测和识别中很有用。 轮廓的作用: - 用于图形分析 - 物体的识别和检测 注意点: - 为了检测的准确性,需要先对图像进行**二值化**或**Canny操作**。 - 画轮廓时会修改输入的图像…

【轻量化网络】MobileNet系列

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, CVPR2017 论文:https://arxiv.org/abs/1704.04861 代码: 解读:【图像分类】2017-MobileNetV1 CVPR_說詤榢的博客-CSDN博客 MobileNetV2: Inverted …

web 网页开发学习 之 vsc 的快捷方式便捷使用

我们想在vsc进行网页的开发如果能够掌握一些快捷键的技巧,那么对我们开发的帮助就会很大

windows弹出交互式服务检测怎么取消

现象 解决办法 打开控制面板->管理工具->服务->Interactive Services Detection 右键属性->常规选项卡中把启动类型选为禁用 禁用之后点击应用和确定 点击停止

Games202(P6、P7)环境光照与PRT全局光照

P6、实时环境光照 RealTime Environment Mapping 不同于全局光照 (1) IBL 我的Blog: QT with OpenGL(IBL-漫反射辐照)IBL-镜面反射(预滤波篇)IBL-镜面反射(LUT篇)QT with OpenGL(IBL-镜面反…

React refers to UMD global, but the current file is a module vite初始化react项目

vite搭建react项目 初始化项目 npm create vite 在执行完上面的命令后,npm 首先会自动下载create-vite这个第三方包,然后执行这个包中的项目初始化逻辑。输入项目名称之后按下回车,此时需要选择构建的前端框架: ✔ Project na…

机器人连续位姿同步插值轨迹规划—对数四元数、b样条曲线、c2连续位姿同步规划

简介:Smooth orientation planning is benefificial for the working performance and service life of industrial robots, keeping robots from violent impacts and shocks caused by discontinuous orientation planning. Nevertheless, the popular used quate…

Python对象序列化

迷途小书童的 Note 读完需要 7分钟 速读仅需 3 分钟 大家好,我是迷途小书童! 在 Python 开发中,我们经常需要将对象数据保存到磁盘,或者通过网络传输对象信息。这时就需要序列化,Pickle 库为我们提供了极为方便的对象序…

Python基础篇(18):模块与包

一、as 关键字的使用 1、as 关键字的作用:给导入的模块取别名 import 测试1 as Test_1 import 测试2 as Test_2Test_1.say_hello() Test_2.say_hello() 二、if __name__ __main__ 1、作用 测试当前模块所编写的代码块,根据业务自主选择需要运行的代…

433MHz芯片在遥控应用市场中的优点

当涉及到简单的无线射频通信,433MHz芯片成为一种经济实惠且广泛应用的选择。以下是关于433MHz芯片的重点信息: 工作原理:433MHz芯片的工作原理是将数字信号转化为射频信号,并通过无线信道进行传输。在接收端,射频信号再…

关于Windows11系统,使用适用于Android的windows子系统 ,安装应用后无法连接网络的问题

–by 旧人旧梦旧时光 最近在使用win11自带的android模拟器时遇到了应用无法连接网络的问题,现在得到了解决,记录一下。 经过思考,发现是由于之前无意打开了这个选项,导致的应用无法连接网络,因此,把该选项…

Topaz Photo AI for Mac(AI人工智能降噪放大软件)

Topaz Photo AI是一款专业的照片处理软件,它利用深度学习和人工智能技术,提供了强大的图像增强和修复功能。无论你是想改善照片的质量,还是想给照片添加特效和艺术效果,Topaz Photo AI都能帮助你实现。 Topaz Photo AI还具备强大…

【uni-app】—3.新建一个uni-app项目

一、新建uni-app项目 1. 打开HBuilder X 2. 新建项目 3. 配置项目信息 4. 安装Sass 插件 (因为项目需要) 这里需要登录,自行用邮箱注册登录,再下载安装插件,安装完成如下 二、项目目录扩展 1. 初始化项目目录 2. 扩…

Grafana 图表配置快速入门

Grafana图表配置 文章目录 Grafana图表配置panel图表配置预览区数据设置区查询设置区转换设置区告警设置区 图表设置区Setting设置Visualization 可视化Display 显示Axes 轴legend 图例Thresholds 阈值 参考 panel图表配置 预览区:用来预览设置的图表。数据设置区&…