数据结构入门 — 栈

news2024/9/20 17:01:05

本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。

  • 博客主页:Duck Bro 博客主页

  • 系列专栏:数据结构专栏

  • 关注博主,后期持续更新系列文章

  • 如果有错误请大家批评指出,博主会及时修改

  • 感谢大家点赞👍收藏⭐评论✍


数据结构入门 — 栈

本文关键字:栈、概念及结构、动图、接口实现

文章目录

  • 数据结构入门 — 栈
    • 1. 栈的概念及结构
      • 1.1 栈的概念
      • 1.2 栈的结构
    • 2. 栈的实现
      • 2.1 动态增长栈结构
      • 2.2 初始化栈
      • 2.3 入栈
      • 2.4 出栈
      • 2.5 获取栈顶元素
      • 2.6 获取栈中有效元素个数
      • 2.7 检测栈是否为空
      • 2.8 销毁栈


1. 栈的概念及结构

1.1 栈的概念

栈(Stack)是一种特殊的线性数据结构,它的特点是仅允许在一端进行插入和删除操作。这一端被称为栈顶(Top),另一端称为栈底(Bottom)。栈的操作模式为后进先出(Last In First Out,LIFO),是一种简单的“先进后出”的顺序结构。

栈通常可以用数组或链表实现,常用的操作包括入栈(Push)和出栈(Pop)。入栈操作是将新的元素插入到栈顶,出栈操作是将栈顶的元素删除并返回。此外,栈还有一些其他的操作,如获取栈顶元素(Top)、判断栈是否为空(IsEmpty)等。往栈中插入元素的操作叫做push,从栈中删除元素的操作叫做pop,查看栈顶元素的操作叫做top。
在这里插入图片描述

1.2 栈的结构

栈结构可以用数组或链表实现

  1. 数组实现栈:栈底用数组下标为0的位置,栈顶用数组下标为n-1的位置(n为数组长度)。入栈操作就是将元素插入到数组末尾,出栈操作就是将数组末尾元素删除并返回。由于数组有固定的大小,因此当栈满时就无法再插入元素,这种情况称为栈溢出。

  2. 链表实现栈:链表中的每个节点保存一个元素和一个指向下一个节点的指针。栈顶指针指向链表的头部,入栈操作就是将新元素插入到链表头部,出栈操作就是将链表头部元素删除并返回。由于链表的大小能够动态地调整,因此它即使在没有预留额外空间的情况下也能灵活地添加或删除元素。

在实现栈时,还需要考虑一些细节问题,比如空栈的情况,如何判断栈满或栈空等。

2. 栈的实现

2.1 动态增长栈结构

使用动态增长的结构,top为栈内元素个数、capacity表示栈内的容量

typedef int STDatatype;

typedef struct StackList
{
	STDatatype* a;
	int top;
	int capacity;
}STL;

2.2 初始化栈

初始化先将指针a置为空,top、capacity置为0

void STInit(STL* pc)
{
	assert(pc);
	pc->a = NULL;
	pc->top = 0;
	pc->capacity = 0;
}

2.3 入栈

这里使用realloc函数的特性,当指针为空时,跟malloc函数的效果相同,入栈即尾插

void STPush(STL* pc, STDatatype x)
{
	assert(pc);
	if (pc->capacity == pc->top)
	{
		int newcapacity = pc->capacity == 0 ? 4 : pc->capacity * 2;
		STDatatype* temp = (STDatatype*)realloc(pc->a, sizeof(STDatatype) * newcapacity);
		if (temp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		pc->a = temp;
		pc->capacity = newcapacity;
		
	}
	pc->a[pc->top] = x;
	pc->top++;
}

2.4 出栈

这里的出栈,即尾删

void STPop(STL* pc)
{
	assert(pc);
	assert(pc->top > 0);

	--pc->top;
}

2.5 获取栈顶元素

top指向栈顶的后一个,获取栈顶元素时要将top减1

STDatatype STTop(STL* pc)
{
	assert(pc);
	assert(pc->top > 0);

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

2.6 获取栈中有效元素个数

top中记录了栈内的元素个数,直接返回top即可

int STSize(STL* pc)
{
	assert(pc);

	return pc->top;
}

2.7 检测栈是否为空

如果栈内为空,则top为0就是栈是空的

bool STEmpty(STL* pc)
{
	assert(pc);

	return pc->top == 0;
}

2.8 销毁栈

释放a内的内存。将top\capacity置为0

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

在这里插入图片描述

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

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

相关文章

一百七十、Linux——Crontab定时任务调度Kettle脚本

一、目的 由于用海豚调度器调度从Kafka到HDFS的kettle任务时发现有点问题,如果不设置定时调度,这个kettle任务会一直跑,而如果设置定时调度,隔天后就会生成多个任务,而且每个任务都在跑,不会停下&#xff…

stable diffusion实践操作-提示词

本文专门开一节写提示词相关的内容,在看之前,可以同步关注: stable diffusion实践操作 正文 提示词是SD中非常重要,你生成的图片质量,基本就取决于提示词的好坏,提示词分为正向提示词和反向提示词。 模板…

激光切割机自动调焦技术详解加图解

激光切割机在切割不同材料的过程中,激光束的焦点必须根据要求位于材料的不同位置。 因此,在切割不同材料的物料时,需要调整激光切割机的焦点位置。在以前的生产激光切割机中,普遍采用手动调焦的方法进行调焦。现在,许多…

【Docker】用Dockerfile制作个人的镜像文件

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

stable diffusion实践操作-常见lora模型介绍

本文专门开一节写Lora相关的内容,在看之前,可以同步关注: stable diffusion实践操作 模型分两种,一种是sd大模型,一种是类似Lora的小模型 国内的是:https://www.liblibai.com 国外的是:https:/…

企业数字化建设-采购平台规划方案PPT(附数字化建设方案300份)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除,更多浏览公众号:智慧方案文库 46页《智慧书店数字化转型解决方案》.pdf8页德勒数字化智能制造解决方案.pdf24页数字化智能化车间规模与建设.pdf数字化校…

【C++】C++11新特性(下)

上篇文章(C11的新特性(上))我们讲述了C11中的部分重要特性。本篇接着上篇文章进行讲解。本篇文章主要进行讲解:完美转发、新类的功能、可变参数模板、lambda 表达式、包装器。希望本篇文章会对你有所帮助。 文章目录 一…

【整数列表求三的倍数】

问题描述: 给定一个从1到n的整数列表,从第一个数字开始计数,遇到3的倍数时,将该数从列表中删除,直至列表末尾。 在剩下的数字中,从第一个数字开始,继续之前的计数值,同样遇到3的倍数时&#xff…

插值法修正排斥能

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由5张二值化的图片组成,让A中有3个点,B全为0,排列组合A,统计迭代次数并排序。 其中的7组数据 差值结构 迭代次数 构造平均列 L E 0 1…

Jmeter的自动化测试实施方案

前言: Jmeter是目前最流行的一种测试工具,基于此工具我们搭建了一整套的自动化方案,包括了脚本添加配置、本地配置和运行、服务器配置等内容,完成了自动化测试闭环,通过这种快捷简便高效的方式,希望可以解…

【云原生之Docker实战】使用Docker部署flatnotes笔记工具

【云原生之Docker实战】使用Docker部署flatnotes笔记工具 一、flatnotes介绍1.1 flatnotes简介1.2 flatnotes特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载flatnotes…

Python“梦寻”京东商品详情数据接口(含代码示例)

要通过京东的API获取商品详情数据,您可以使用京东开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例,展示如何通过京东开放平台API获取商品详情数据: 首先,确保您已注册成为京东开放平台的开发者,并创…

SourceTree安装教程

PS:SourceTree是一款流行的免费Git和Mercurial版本控制工具,由Atlassian开发和维护。它提供了一个直观且功能强大的图形用户界面,方便开发人员管理和浏览代码仓库 说白了,他就是一个可视化的git界面,还是非常好用的&am…

10.Redis 渐进式遍历

Redis 渐进式遍历 渐进式遍历scan 渐进式遍历 keys 命令一次性的把整个redis中所有的key都获取到,keys *但这个操作比较危险,可能会一下子得到太多的key,阻塞 redis 服务器。 通过渐进式遍历,就可以做到,既可以获取到所有的 key&…

wireshark 流量抓包例题

一、题目一(1.pcap) 题目要求: 1.黑客攻击的第一个受害主机的网卡IP地址 2.黑客对URL的哪一个参数实施了SQL注入 3.第一个受害主机网站数据库的表前缀(加上下划线例如abc) 4.第一个受害主机网站数据库的名字 看到题目SQL注入&#xff0c…

Python 案例实训教学,支持“教师-学生”双视角切换|ModelWhale 版本更新

学年伊始、辞旧迎新,金秋九月,ModelWhale 迎来新一轮的版本更新,持续优化你的使用体验。 本次更新中,ModelWhale 主要进行了以下功能迭代: • 新增 “教师-学生”双视角切换(团队版✓) • 新…

测试架构师必备技能 —— Nginx安装部署实战

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的免费开源Web和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。在高并发访问的情况下,Nginx是Apache服务器不错的替代品。官网数据显示每秒TPS高达50W左右。本文…

从《孤注一掷》出发,聊聊 SSL 证书的重要性

你去看《孤注一掷》了吗?相信最近大家的朋友圈和抖音都被爆火电影《孤注一掷》成功刷屏。取材于上万真实案例的《孤注一掷》揭露了缅甸诈骗园区残暴的统治,以及电信诈骗中系统性极强的诈骗技巧,引发了大量讨论。 图片来源于电影《孤注一掷》…

PostgreSQL 查询语句大全

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

多应用模式下,忽略项目的入口文件,重写Apache规则

多应用模式下,忽略项目的入口文件,重写Apache规则 首先,我的项目是具有两个应用,admin和index,同时给它们绑定了域名,但是每次访问时都需要加入项目的入口文件地址 index.php ,为了忽略这个入口文件,只能通…