数据结构学习之栈

news2025/1/19 11:01:07

这里写目录标题

  • 栈的定义与性质
  • 栈的实现
    • 栈的定义
    • 栈的功能
      • 栈的创建
      • 入栈
      • 出栈
      • 栈顶
      • 判断栈为空
      • 得到栈的个数
      • 栈的销毁

栈的定义与性质

第一个问题:什么是栈?
栈的定义是:
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。

进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

分解一下就是:
首先是顺序表
只在一个端口进行数据插入和删除,这个端口叫做栈顶
另一个端口叫做栈底

元素的顺序遵循后进先出,先进后出的原则

第二个问题就是
什么是先进后出,什么是后进先出
就和手枪一样,在弹夹中,先压进去的子弹在弹夹的底部,后压入的子弹在弹夹的顶部,在顶部的子弹会先射出来

图解就是这样
在这里插入图片描述
这里是按照顺序入栈的方式,但是我们也可以不用顺序入栈,而是乱序入栈,结果就可能不一样
这个是栈的基本性质,针对这个基本性质,我们就能够实现栈

栈的实现

栈的定义

第一个问题,我们用顺序表还是链表实现?
栈的实现可以使用数组或者链表,但是相对而言数组的尾插是直接用最后一个下标插入就能够实现的,实现代价很小
所以我们使用数组

然后就是如何定义栈的问题
栈有如下特性,一块空间,栈顶部的位置,由于我们要动态使用栈,所以还要有栈空间的大小

struct Stack
{
	StackData* a;
	int top;
	int cap;
};

栈的功能

栈有哪些功能?
栈的创建,栈的销毁,入栈,出栈,判断栈为空,统计栈元素个数,获得栈顶元素

栈的创建

栈的创建本质是数组的创建
定义数组默认大小为 4
对空间进行开辟

为何要传地址,因为我们修改的是函数外部的栈,要用地址修改

void StackInit(Stack* qs)
{
	//暂时取4个字节大小
	Stackdata* arr = (Stackdata*)malloc(sizeof(Stackdata)*4);
	if (arr == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	qs->a = arr;
	qs->top = 0;
	qs->cap = 4;
}

入栈

入栈,数据存放在最后的位置上
根据设定,我们的top用来描述占中存放的数据个数
也就是下一个数据要插入的位置
所以入栈
就是,如果空间足够就入栈,不足就开辟空间
然后 top++
程序

void StackPush(Stack* qs, Stackdata x)
{
	if (qs->top == qs->cap)
	{
		int newcap = qs->cap * 2;
		Stackdata* newarr = (Stackdata*)realloc(qs->a,newcap*sizeof(Stackdata));
		if (newarr==NULL)
		{
			perror("realloc failed");
			exit(-1);
		}
		qs->a = newarr;
		qs->cap = newcap;
	}
	qs->a[qs->top] = x;
	qs->top++;
}

需要注意的是 因为 top 是 qs 结构体的一个内容
所以索引是 qs->top
存放数据应该放的位置是 qs->a[qs->top]

出栈

出栈的过程就是访问不到 top 上一个位置的元素
访问不到的意思就是
下一次插入,这个数字不会阻挡插入
访问栈头,不会访问到这个数
所以只要 top – 就能够达到这个效果
同时如果为空就不能出栈

void StackPop(Stack* qs)
{
	if (StackEmpty(qs))
	{
		printf("出栈失败,已经空了\n");
		return;
	}
	qs->top--;
}

栈顶

栈的使用是获取栈顶的元素
当栈不为空的时候

Stackdata StackTop(Stack* qs)
{
	assert(!StackEmpty(qs));
	return qs->a[qs->top-1];
}

assert 说明就是当栈为空的时候 直接报错
因为在设置中 top 是栈元素个数,所以栈顶为 top-1 位置上的元素

判断栈为空

当 top == 0 的时候
栈为空
程序

bool StackEmpty(Stack* qs)
{
	if (qs->top == 0)
	{
		return true;
	}
	return false;
}

得到栈的个数

因为 top 本身统计的就是数字个数
所以程序

int countStack(Stack* qs)
{
	return qs->top;
}

栈的销毁

销毁后
结构体中数组空间释放,并且把参数置为 0

void StackDestroy(Stack* qs)
{
	assert(qs);
	free(qs->a);
	qs->a = NULL;
	qs->cap = 0;
	qs->top = 0;
}

希望大家看完,能够有所收获
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容

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

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

相关文章

【从零开始学习深度学习】45. Pytorch迁移学习微调方法实战:使用微调技术进行2分类图片热狗识别模型训练【含源码与数据集】

通常为了使模型的预测精度达到较高的标准,需要收集十分庞大的数据集来进行模型训练。一种比较巧妙解决该问题的办法是应用迁移学习(transfer learning),将从某个已有的数据集学到的知识迁移到目标数据集上。例如,假如我…

微信小程序安装 Vant 组件库与API Promise组件库并实现简单的增删改查

在项目内右键空白处选择在外部终端打开2、在终端窗口输入 npm init -y,创建package-lock.jsonnpm init -y3、在终端输入npm i vant/weapp1.3.3 -S --production,创建node_modules文件夹npm i vant/weapp1.3.3 -S --production4、详情-本地设置&#xff0…

Vue2.0开发之——Vue组件-组件的实例对象(36)

一 概述 浏览器无法直接解析Vue文件package.json中的’vue-template-compiler’将vue结尾的文件解析为js文件交给浏览器处理Count组件实例对象 二 浏览器无法直接解析Vue文件 将Vue文件拖放到浏览器中无法直接显示 三 package.json中的’vue-template-compiler’将vue结尾的文…

软件著作权登记指南

一、什么是计算机软件《计算机软件保护条例》第二条、第三条规定,本条例所称计算机软件(以下简称软件),是指计算机程序及其有关文档;(一)计算机程序,是指为了得到某种结果而可以由计…

第13章 Token的Postman、Swagger和Vue调试

1 准备工作 1.1 WebApi.Controllers.JwtSettingModel namespace WebApi.Test { /// <summary> /// 【Jwt设置模型--纪录】 /// <remarks> /// 摘要&#xff1a; /// 通过该纪录中的属性成员实例存储“AppSettings.json”文件中的Jwt相关设置数据&#xff0…

java应用程序多级缓存架构

多级缓存架构 一级缓存&#xff1a;OpenResty—Lua—Redis 二级缓存&#xff1a;Nginx proxy-cache 三级缓存&#xff1a;Redis 使用OpenResty lua脚本访问redis proxy-cache 缓存注解 <!--依赖--> <dependency><groupId>org.springframework.boot</gr…

最新研究发现:天然海绵含有抑制Omicron变体感染的天然化合物

本文原文首发于2023年1月9日E-LIFESTYLE &#xff08;阅读时间4分钟&#xff09; 附标题&#xff1a;通过研究370多种来自植物、真菌和海绵等天然来源的化合物&#xff0c;寻找可用于治疗新冠肺炎的新抗病毒药物&#xff0c;用这些天然化合物制成的溶液中沐浴人类被SARS-CoV-2感…

SolidWorks装配体保存成零件,能有效压缩文件体积,方便二次装配

SolidWorks装配体保存成零件&#xff0c;能有效压缩文件体积&#xff0c;方便二次装配1. 先使用solidworks打开我们要转换成零件的装配体2. 然后点击上方保存下面的小三角&#xff0c;选择另存为3.之后选择要保存的位置&#xff0c;点击文件格式&#xff0c;然后在文件格式里找…

Zabbix监控服务详解+实战

目录 一、监控体系概述 1. 为什么需要监控 2. 监控目标与流程 &#xff08;1&#xff09;监控的目标 &#xff08;2&#xff09; 监控的流程 3. 监控的对象 &#xff08;1&#xff09;CPU监控 &#xff08;2&#xff09;磁盘监控 &#xff08;3&#xff09;内存监控 …

win7电脑怎么录屏?免费的录屏软件分享

现在大家的电脑一般是win10、11系统&#xff0c;但是还是有一些小伙伴喜欢使用win7系统的电脑。那你知道win7电脑怎么录屏吗&#xff1f;有没有好用且简单的win7电脑录屏软件推荐&#xff1f;当然有&#xff01;今天小编给使用win7电脑的小伙伴推荐两款简单且好用的电脑录屏软件…

各类字符串函数和内存函数的使用以及模拟(万字解析)

函数一.字符串函数(使用都需要包含string.h)1.求字符串长度—strlen2.长度不受限制的字符串函数1.strcpy-字符串拷贝2.strcat-追加字符串3.strcmp-字符串比较4.为什么长度不受限制3.长度受限制的字符串函数—strncopy,strncat,strncmp4.字符串查找1.strstr-判断是否为子字符串2…

Linux 文件句柄导致系统压力测试时出现错误率

最近&#xff0c;在对一个golang写的获取商品详情信息的接口做压力测试时&#xff0c;tps 单机可以达到1400多&#xff0c;但是发现每当压力测试开始2分钟多时就会出现502或504 错误&#xff0c;整体的错误率在0.5%左右。一开始是怀疑代码写的效率不高&#xff0c;是不是协程开…

【SAP Hana】SAP HANA SQL 进阶教程

SAP HANA SQL 进阶教程5、HANA SQL 进阶教程&#xff08;1&#xff09;Databases&#xff08;2&#xff09;User & Role&#xff08;3&#xff09;Schemas&#xff08;4&#xff09;Tables&#xff08;5&#xff09;Table Index&#xff08;6&#xff09;Table Partitions&…

于仕琪C/C++ 学习笔记

C函数指针有哪几类&#xff1f;函数指针、lambda、仿函数对象分别是什么&#xff1f;如何利用谓词对给定容器进行自定义排序&#xff1f;传递引用和传递值的区别&#xff1f;传递常引用和传递引用之间的区别&#xff1f;传递右值引用和传递引用之 间的区别&#xff1f;函数对象…

【PWA学习】6. 使用 Service Worker 进行后台同步

引言 你一定遇到过类似这样的场景&#xff1a; 当用手机填写完一张信息表单点击"提交"时&#xff0c;恰好手机网络很差或没有网络&#xff0c;这时候只能盯着手机看着旋转的小圆圈。经过长时间等待后依然没有结果&#xff0c;这时候关闭浏览器&#xff0c;请求也被终…

红外传感器使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、红外传感器&#xff1f;二、使用步骤1.确保驱动已经安装2.安装GPIO工具3.安装GPIO的Python支持4.Python3代码5.测试结果总结前言 最近在做一个项目需要用到…

Linux命令学习

1、linux目录结构 linux目录结构是一个树状结构 当我们直接打开ubuntu的控制台&#xff0c;进入的是 home 目录下的创建的用户&#xff0c;这里是真正的 家 目录 或者在安装 ssh 服务器之后可以直接通过 windows 命令行 访问 ubuntu 的ssh服务器&#xff0c;进入的是 home 目录…

【规范】我们是怎么做MySQL数据库安全管理的?

一、背景说明 MySQL作为数据库管理系统&#xff0c;里面保存企业的重要业务数据&#xff0c;因此保证数据库的安全性非常重要&#xff0c;如何保证数据库的安全性呢&#xff1f;用户和用户权限管理是一个很重要的方面。 MySQL数据库具有非常高的安全性&#xff0c;为我们提供…

Vue 2 即将成为过去

自从 2020 年 9 月 18 日 Vue 3 正式发布以来&#xff0c;已经有两年多时间了&#xff0c;终于在 2022 年 2 月 7 日 Vue 作者发布了一则消息&#xff1a;Vue 3 将成为新的默认版本。与此同时&#xff0c;Vue 相关官方周边的核心库 latest 发布标签将指向其 Vue 3 的兼容版本。…

从0到1完成一个Vue后台管理项目(二十一、网上地图资源、树形控件及路由权限分析、路由守卫)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…