(数据结构)栈的实现——再一次保姆级教学

news2024/11/28 2:47:15

目录

1. 栈

​编辑

 1.2 栈的实现

2. 代码的实现

2.1 初始化栈和销毁栈

2.2栈顶元素的插入

2.3栈顶元素的删除

栈元素删除

2.4栈顶元素的获取和栈元素的个数


1. 栈

1.1 栈的概念和结构

栈(Stack)是一种线性存储结构,它具有如下特点:
(1)栈中的数据元素遵守”先进后出”(First In Last Out)的原则,简称FILO结构。
(2)限定只能在栈顶进行插入删除操作。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶

注意:我们在进行数据插入和删除操作中,都是在栈顶实现的,而另一端叫做栈底。

我们借用一下这个图来说明:

 1.2 栈的实现

我们这里可以通过两种方法实现,顺序表链表。

这里我们会发现链表要尾插或者尾删需要便利一遍链表,效率低;顺序表尾插尾删很快,但是还要解决扩容问题。

所以这里我们就引出了栈这个东西

2. 代码的实现

这里我们需要说明一下,之前我们在实现链表或者顺序表双向链表中都用的是size,为了更好的明确个数。

这里top指的是栈顶元素,如果初始化为 ” -1 “ ,指的是栈顶元素;如果为 “ 0 ” ,指的是栈顶的下一个元素。

这里面我建议是初始化为0

  • top还可以表示元素的个数,可以用来判断栈是否满了
  • 插入元素的时候直接在top的位置插入就行,然后再top++即可

 废话不多先来个头文件

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

void STInit(ST* pst);
void STDestroy(ST* pst);
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
STDataType STTop(ST* pst);
bool STEmpty(ST* pst);
int STSize(ST* pst);

2.1 初始化栈和销毁栈

我们首先要检查一下结构体是否为空,这里我们要注意一下

void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;

	//pst->top = -1;   // top 指向栈顶数据
	pst->top = 0;   // top 指向栈顶数据的下一个位置

	pst->capacity = 0;
}

这里我们断言结构体不为空在继续,释放我们开辟的空间,将其他数据置为0

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

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

2.2栈顶元素的插入

这里面我们要判断储存空间是否足够,如果没有开辟,我们可以先开辟一些空间出来;如果栈空间满了,直接将栈空间扩大二倍

void STPush(ST* pst, STDataType x)
{
	if (pst->top == pst->capacity)
	{
		int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		pst->a = tmp;
		pst->capacity = newCapacity;
	}

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

2.3栈顶元素的删除

注意:当top为0,代表我们没有元素,不能再减下去,需要一个函数判断一下

判断函数

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

	/*if (pst->top == 0)
	{
		return true;
	}
	else
	{
		return false;
	}*/

	return pst->top == 0;
}

栈元素删除

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

	pst->top--;
}

2.4栈顶元素的获取和栈元素的个数

这里面我们初始化为0,所以我们返回栈顶元素前一个元素即可;如果为空,需要我们断言一下

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

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

元素个数

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

	return pst->top;
}

以上就是今天栈实现的分享,如果喜欢的话请三联支持一下吧,感谢你的收看,我们下期再见!!!

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

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

相关文章

git的学习3

文章目录 一、git status 命令二、git diff 命令三、git commit 命令四、git reset 命令五、git rm 命令六、git mv 命令七、提交日志1、Git 查看提交历史2、git blame 总结 提交与修改部分 一、git status 命令 git status 命令用于查看在你上次提交之后是否有对文件进行再次…

jenkins集成sonarqube进行代码质量检测

Jenkins集成Sonar Qube实现代码扫描需要先下载整合插件 安装SonarQube scanner 插件,安装完后,插件展示如下 配置SonarQube 的配置信息 这里给名称取为:sonarqubeFirst, server Url设置为SonarQube的地址,为http:19…

类和对象【1】初识

全文目录 引言(初识面向对象)类和对象定义类访问限定及封装类定义的两种方式 类实例化与类对象大小this指针 总结 引言(初识面向对象) C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通…

如何使用Understand软件查看STM32单片机HAL库函数调用关系

在使用STM32单片机的HAL库函数编程时,会发现好多中断函数里面都有各种回调函数,还有好多函数的调用深度比较深,在编写代码的时候,有时候想查看某个函数是如何被调用的,查看起来非常麻烦。这时候就可以使用Understand软…

Android活动生命周期

GitHub:https://github.com/MADMAX110/Stopwatch 活动的生命不只是有创建和撤销,onCreate和onDestroy方法用来处理整个生命周期,除了这两个方法,另外还有一些处理活动可见性的生命周期方法。 具体来讲,有三个关键的生…

Flink学习——DataStream API

一个flink程序,其实就是对DataStream的各种转换。具体可以分成以下几个部分: 获取执行环境(Execution Environment)读取数据源(Source)定义基于数据的转换操作(Transformations)定义…

.net6 接收json数据 Controller http post

.net6 接收json数据 Controller http post 要添加这两个包 前端ajax请求 function tst() {$.ajax({type: "POST",contentType: "application/json",url: "/HelloWorld/Welcome",data: JSON.stringify({ "ID":1,"name": &…

Qt实现undo和redo功能--连续后退

刚开始想做这个的时候,我专门去找了Qt官方的测试例子,运行起来点了点,代码翻了翻。然后照猫画虎般的写了个测试例子。 不明白,为什么每个例子旁边会有个命令的显示列表,还巨丑的那种,这如果要放在别的程序…

DJ6-4 文件存储空间的管理

目录 6.4.1 空闲表 1、存储空间的分配与回收 2、空闲表法的优缺点 6.4.2 空闲链表 1、空闲盘块链 2、空闲盘区链 6.4.3 位示图 1、位示图的表示 2、存储空间的分配 3、存储空间的回收 4、位示图法的优缺点 6.4.4 成组链接 1、空闲盘块的组织 plus 个人理解图…

前端web入门-HTML-day01

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 HTML初体验 HTML 定义 标签语法 总结: HTML 基本骨架 基础知识: 总结&#…

20年磨一剑,数慧时空推出智能遥感云平台DIEY及自然资源多模态大模型“长城”

5月17日,主题为“时空智能 从感知到决策”的第十二届全球地理信息开发者大会(WGDC2023)在北京昆泰酒店举行。大会聚集了千余位产业专家、行业用户、创新企业等业界精英,共话时空智能时代下的技术发展与应用创新。中国科学院院士、…

初始计算机操作系统——进程与线程,多线程以及Thread类的创建和属性

目录 通过前半篇文章需要了解 1.进程(process/task):运行起来的可执行文件。 为啥要有进程? 如何解决这个问题? (1)进程池: (2)使用线程: 为啥线…

国考省考行测:判断推理,类比推理1,概念关系,包含关系,交叉关系,并列关系,全同关系

国考省考行测:判断推理,类比推理1,概念关系,包含关系,交叉关系,并列关系,全同关系 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论&#x…

chatgpt赋能Python-libreoffice_python扩展

LibreOffice Python扩展: 提升办公效率的利器 如果你一直在寻找一种提高办公效率的方法,那么你肯定会喜欢LibreOffice Python扩展。作为LibreOffice的一个特性,它可以让你使用Python编写宏程序自动化你的日常办公任务。 什么是LibreOffice Python扩展&…

力扣sql中等篇练习(二十一)

力扣sql中等篇练习(二十一) 1 最大数量高于平均水平的订单 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # Write your MySQL query statement below WITH t1 as (SELECT order_id,avg(quantity) AquantityFROM OrdersDeta…

chatgpt赋能Python-numpy数据预处理

Numpy数据预处理综述 介绍 Numpy是Python中最流行的数学库之一,可以用于高效的处理大型数据。Numpy提供了各种强大的数据结构和函数,使得数据分析和处理变得更加容易和直观。本文将介绍numpy中的一些数据预处理技术,包括数据清洗、缩放、归…

chatgpt赋能Python-mingw编译python

Mingw编译Python:一种常用的解决方案 在Python开发中,为了获得更好的性能,我们通常会选择编译Python源代码。而在Windows平台上, Mingw编译器是一种常用的解决方案。本文将介绍Mingw编译Python的过程,并探讨其优缺点。…

chatgpt赋能Python-numpy创建

Numpy:Python中的数学计算利器 作为Python中进行数学计算和科学计算最重要的库之一,Numpy已经成为了Python编程中的标配。Numpy以其出色的数组处理能力和矩阵运算效果,让Python用户的数学计算和科学计算变得更加简单高效。在本篇文章中&…

【半监督学习】Match系列.4

介绍几篇关于半监督学习的论文:CLS(arXiv2022),Ada-CM(CVPR2022),SemiMatch(CVPR2022). CLS: Cross Labeling Supervision for Semi-Supervised Learning, arXiv2022 解…

mysql增量备份

目录 一、修改配置文件,开启增量备份功能 (1)查看是否已经开启了 (2)修改配置文件开启 (3)增量记录文件 二、还原增量备份 (1)修改了数据 (2&#xff…