数据结构和算法之《栈》详解

news2024/11/19 5:39:39

标题:栈的思路及代码实现

作者:@Ggggggtm

寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景

文章目录:

一、栈的概念及结构

1、1 栈的概念

1、2 栈的结构

二、栈的思路及代码实现详解

2、1 栈的实现思路详解

2、2 栈的代码实现

2、2、1 定义结构体

2、2、2 初始化结构体

2、2、3 释放动态开辟数组

2、2、4  判断栈是否为空

2、2、5 插入数据

2、2、6 删除数据

2、2、7 栈顶元素

2、2、8 栈的大小 

三、取出栈中的元素


一、栈的概念及结构

1、1 栈的概念

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

  压栈:栈的元素插入操作叫做进栈/压栈/入栈入数据在栈顶

  出栈:栈的元素删除操作叫做出栈,出数据也在栈顶

1、2 栈的结构

二、栈的思路及代码实现详解

2、1 栈的实现思路详解

  栈的操作无非解释插入和删除,我们可以想到用顺序表或者链表来实现。在栈中的插入和删除操作我们可以看作尾插和尾删。相对与链表来说,顺序表的尾插尾删效率还是高的。 因为单链表的尾删还要记录前一个元素,相对而言效率就低了。如果是双向循环链表,则效率会更高。当然,在栈中的插入和删除操作我们还可以看作头插和头删。这时候链表的效率就比顺序表的效率高了。因为顺序表的头插或者头删都需要移动整个顺序表的元素。

  在这里我就给大家讲解栈的插入和删除操作以尾插和尾删的顺序表形式实现。

  完整的栈实现都需要有哪些模块呢?我给大家一一列举一下:

  1. 定义一个结构体,该结构体包含一个可以存放数据的数组指针及一个记录栈顶的变量和一个记录数组容量的变量;
  2. 初始化结构体;
  3. 释放动态开辟数组;
  4. 判断栈是否为空;
  5. 插入数据;
  6. 删除数据;
  7. 栈顶元素;
  8. 栈的大小。

  接下来我给大家一一讲解实现。

2、2 栈的代码实现

2、2、1 定义结构体

  上面我们提到,定义结构体时该结构体包含一个可以存放数据的数组指针及一个记录栈顶的变量和一个记录数组容量的变量,那么代码的实现就简单了。 

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

2、2、2 初始化结构体

  初始化结构体时,我们只需要把数组置空,栈顶和容量置零即可。 

void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

2、2、3 释放动态开辟数组

  当我们定义一个栈并且初始化后,当然会进行一系列的插入和删除操作。一定要记得释放栈,避免内存泄漏。

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

2、2、4  判断栈是否为空

  当我们删除元素,或者找栈顶元素使都需要判断栈是否为空。所以我们这里先实现一下这个模块。

bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

2、2、5 插入数据

  插入数据时,我们首先要判断数组是否满了。如果满了的话,我们需要扩容。当然,第一次扩容时,我们应该先给其赋一个值,因为第一次扩容时,capacity为0,乘以任何数为0,所以我们要考虑到这种情况。插入数据也就是顺序表的尾插,实现简单。我们来看一下代码。

void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->capacity == ps->top)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = realloc(ps->a, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			printf("realloc failed\n");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newCapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

2、2、6 删除数据

  删除元素,首先要判断栈不能为空。顺序表的删除十分简单,我们看代码实现。 

void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	ps->top--;
}

2、2、7 栈顶元素

  找栈顶元素,我们因为这里用了top-1为栈顶元素,所以要判断栈不能为空。一但为空,就会越界访问。

STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	return ps->a[ps->top - 1];
}

2、2、8 栈的大小 

  栈的大小即为top-1,非常简单,直接看代码实现。 

int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

三、取出栈中的元素

   我们直到,栈中的元素遵循后进先出LIFQ(Last In First  Out)的原则。所以我们打印栈顶的元素后,就进行对栈顶删除,直到栈为空停止。我们看一下代码的实现。

	ST s;
	StackInit(&s);
	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);
	printf("%d ", StackTop(&s));
	StackPop(&s);

	printf("%d ", StackTop(&s));
	StackPop(&s);
	StackPush(&s, 5);
	StackPush(&s, 6);
	//StackPop(&s);
	//取出栈中的数据
	while (!StackEmpty(&s))
	{
		printf("%d ", StackTop(&s));
		StackPop(&s);
	}
	StackDestroy(&s);	
    while (!StackEmpty(&s))
	{
		printf("%d ", StackTop(&s));
		StackPop(&s);
	}

  上面的代码是我们先压栈四个元素,然后打印并且出栈两个元素,再次压栈两个元素,最后一次取出。那么结构就是:4 3 6 5 2 1。 

  综上就是我们整个栈的实现了,希望本篇文章会对您有所帮助,感谢阅读。

  后续会一直更新数据结构与算法的内容的哦ovo~ 

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

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

相关文章

电脑技巧:推荐5个非常实用的软件

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

uniapp 之使用 u-upload 组件来实现图片上传

uniapp 之使用 u-upload 组件来实现图片上传前言一、官方示例用法分析二、关闭自动上传,使用手动上传的方式,代码html 代码js 代码css 代码总结分析前言 在使用 uniapp 开发的微信小程序中使用了图片上传功能,使用了 uniapp 的图片上传组件 注意:我这里后端接口接收…

小程序开发平台

小程序开发平台顾名思义就是一个可以开发小程序的地方。 小程序开发平台:【电脑浏览器输入3M.FKW.COM了解详情】 适合群体:企业、机构、个体户 小程序开发方式: 自建——可以通过套用小程序模板,利用拖拽式小程序开发工具&…

某组态软件工程文件加密机制探究

某组态软件工程文件加密机制探究 前言 在工业自动化控制领域,组态软件是数据采集与过程控制的专用软件,是实现人机交互必不可少的工具。工程设计人员使用组态软件在PC机上进行工程画面组态的编辑,然后把编译后的组态逻辑通过以太网或串口下载…

HSRP协议(思科私有)/VRRP协议(公有)

数据来源 1、HSRP热备份路由协议(备份网关) 出现背景: 如下图一个公司拉两条网线一条用来备份网关是192.168.0.253,平时用的网关是254,如果网关是254的这条网线出问题了就可以使用备份不影响公司让人员上网&#xff…

2022最新版 Java 学习线路图

第 1 阶段 - 企业级开发 - java 基础 学习掌握本阶段的内容,可以实现诸如迅雷下载软件、QQ 聊天客户端、中小网站,例如:小型旅游网站、小型电商网站的开发 第 2 阶段 - 企业及开发 - 基础框架 学习掌握本阶段内容,可以快速、规范的…

CRC校验——以SHT4xA温湿度传感器为例

CRC校验——以SHT4xA温湿度传感器为例一、简介二、计算方法(一)步骤(二)参考代码(C语言)(三)检验:CRC(0xBEEF) 0x92三、参考一、简介 循环冗余校验码(CRC&am…

[附源码]计算机毕业设计JAVA疫情防控下高校教职工健康信息管理系统

[附源码]计算机毕业设计JAVA疫情防控下高校教职工健康信息管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

试剂盒和示踪剂—艾美捷FLIVO探针活体凋亡检测分析

针对FLIVO(FLuorescence in vIVO)探针的研究,本篇文章推荐艾美捷ImmunoChemistry(ICT)FLIVO探针系列的:天冬氨酸蛋白酶(Caspases)活性检测试剂盒,及 FLIVO示踪剂,主要用于细胞凋亡活体检测,助力…

大型分布式系统下缓存应该怎么玩,才能用得高效

大家好,今天我们来聊一聊在大型分布式系统中,缓存应该怎么玩,从毕业到现在也有三年多了,大大小小的系统也经历了几十个,今天就从各个角度来讨论一下,我们的不同的缓存应该怎么玩,才能用的高效。…

N皇后问题(分支限界法)

问题描述: 在 n * n 格的棋盘上放置彼此不受攻击的 n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题等价于在 n * n 的棋盘上放置 n 个皇后,任何 2个皇后不放在同一行或同一列或同一斜线上…

Ansys Speos | 新型计算方法:使用 GPU 提升计算速率

前言 Speos 在2022R2版本中正式推出 GPU 计算功能,相比于 CPU 计算,相同HPC32配置,高性能显卡在仿真计算中将会更显计算优势,在仿真数据量大、材料属性复杂、光源种类多的条件下,Speos 视觉模拟会消耗更多仿真计算时间…

ARM异常处理(1):异常类型、优先级分组和异常向量表

本系列文章将以Cortex-M3内核为例,对ARM的异常(exception)进行分析。 文章目录1 异常类型2 优先级3 向量表1 异常类型 Cortex-M3提供了一个功能丰富的异常体系结构,它支持很多系统异常和外部中断。异常编号1-15表示系统异常,16及以上表示外部…

0116 查找算法 Day5

剑指 Offer 04. 二维数组中的查找 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该…

2022快手电商短视频运营白皮书:Q2对比Q1GMV总值增长率达12%

1、2022快手电商短视频运营白皮书:Q2对比Q1GMV总值增长率达12%新榜讯 12月2日,快手电商发布《2022快手电商短视频运营白皮书》。白皮书数据显示,2022年4-6月,随着平台商家对短视频渠道的认知提升,挂车短视频生产量不断…

【人脸识别】MVFace:一个优于CosFace和ArcFace的人脸识别损失

论文题目:《Mis-classifified Vector Guided Softmax Loss for Face Recognition》 论文地址:https://arxiv.org/pdf/1912.00833v1.pdf 代码地址:http://www.cbsr.ia.ac.cn/users/xiaobowang/ 1.背景 迄今为止,提出了几种基于mar…

Hashing to elliptic curve算法改进

1. 引言 前序博客有: ECDSA VS Schnorr signature VS BLS signature 第3节“BLS签名” 私钥pkpkpk,对应的公钥为PpkGPpk\times GPpkG。待签名消息mmm。 BLS signature的签名流程为: 1)通过H(m)H(m)H(m)将消息mmm映射为point o…

计算机毕业论文java毕业设计选题源代码javaweb企业门户网站官网

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《javaweb企业门户网站》该项目采用技术:jsp servlet mysqljdbccssjsjQuery等相关技术,项目含有源码、文档、配套开发软件…

[hadoop全分布部署]安装Hadoop、配置Hadoop 配置文件②

👨‍🎓👨‍🎓博主:发量不足 个人简介:耐心,自信来源于你强大的思想和知识基础!! 📑📑本期更新内容:安装Hadoop、配置Hadoop 配置文件…

手把手教你SSM整合(包教包会)

SSM整合 步骤&#xff08;七步&#xff09; 新建maven项目&#xff0c;添加依赖 可以选择根据模版创建maven项目 <dependencies><!--spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc&…