【数据结构】06.栈队列

一、栈

1.1栈的概念及结构

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

在这里插入图片描述

1.2栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
在这里插入图片描述

1.2.1 栈的结点行为

和顺序表一样:一个存储数据的数组,一个变量记录个数,一个变量记录容量。

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

1.2.2 栈的初始化与销毁

//初始化
void StackInit(ST* s)
{
	assert(s);
 
	s->data = NULL;
	s->capacity = s->top = 0;
}
//销毁
void StackDestory(ST* s)
{
	assert(s);
 
	free(s->data);
	s->data = NULL;
	s->capacity = s->top = 0;
}

1.2.3 入栈与出栈

//入栈
void StackPush(ST* s, STDataType x)
{
	assert(s);
	//检查是否需要扩容
	if (s->top == s->capacity)
	{
		int new_capacity = s->capacity == 0 ? 4 : s->capacity * 2;
		STDataType* temp = (STDataType*)realloc(s->data, sizeof(STDataType) *new_capacity);
		if (temp==NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		else
		{
			s->data = temp;
			s->capacity =new_capacity;
		}
	}
		
	s->data[s->top] = x;
	s->top++;
 
}
 
//出栈
void StackPop(ST* s)
{
	assert(s);
	assert(s->top);
	
	s->top -= 1;
}

1.2.4 栈的其他操作

//栈的元素个数
int StackSize(ST* s)
{
	assert(s);
	return s->top;
}
//判空
bool StackEmpty(ST* s)
{
	assert(s);
	return s->top == 0;
}
//取栈顶元素
STDataType StackTop(ST* s)
{
	assert(s);
	return s->data[s->top - 1];
}

二、队列

2.1队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的原则。
入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头
在这里插入图片描述

2.2队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
在这里插入图片描述

2.2.1 队列的结点行为

首先,我们使用链表来实现队列,那么我们需要先定义链表型结点:

typedef int QueueDataType; 
typedef struct QueueNode
{
	QueueDataType data;
	struct QueueNode* next;
}QN;

其次经过分析,我们知道入队列时就是对链表进行尾插操作,尾插的时间复杂度时O(N),因此我们想到用两个结点(一个头结点来控制出队列,一个尾结点来控制入队列)。因此我们自然而然地想起定义一个结构体来控制他们的行为:

typedef struct Queue
{
	QN* head;
	QN* tail;
	int size;//后续进行统计个数时时间复杂度为O(N),引入size,来提高程序效率
}Queue;

2.2.2 队列的初始化与销毁

//初始化
void QueueInit(Queue* s)
{
	assert(s);
 
	s->head = s->tail = NULL;
	s->size = 0;
}
//销毁
void QueueDestory(Queue* s)
{
	assert(s);
	QN* cur = s->head;
	while (cur)
	{
		QN* next = cur->next;
		free(cur);
		cur = next;
	}
	s->head = s->tail = NULL;
	s->size = 0;
}

2.2.3 入队列与出队列

//入队
void QueuePush(Queue* s, QueueDataType x)
{
	assert(s);
 
	QN* newnode = (QN*)malloc(sizeof(QN));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
 
	newnode->next = NULL;
	newnode->data = x;
	//队列是否为空
	if (s->tail == NULL)
	{
		s->head = s->tail = newnode;
	}
	else
	{
		s->tail->next = newnode;
		s->tail = newnode;
	}
	s->size++;
}
 
//出队
void QueuePop(Queue* s)
{
	assert(s);
	//队列为空时,无法再出数据
	assert(s->head);
	
 	//队列是一个元素还是多个元素
	if (s->head->next == NULL)
	{
		s->head = s->tail = NULL;
	}
	else
	{
		QN* next = s->head->next;
 
		free(s->head);
		s->head = next;
	}
	s->size--;
}

2.2.4 队列的其他操作

//队列元素个数
int QueueSize(Queue* s)
{
	assert(s);
	return s->size;
}
//判空
bool QueueEmpty(Queue* s)
{
	assert(s);
 
	return s->head == NULL;
}
//取队头元素
QueueDataType QueueFront(Queue* s)
{
	assert(s);
 
	return s->head->data;
}
//取队尾元素
QueueDataType QueueBack(Queue* s)
{
	assert(s);
 
	return s->tail->data;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类 import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObj…

洗地机品牌哪个最好用?硬核推荐五大实力爆款洗地机

在这个忙碌的时代,家就是我们放松的港湾,但要保持它的清洁与舒适常常很不容易。每天拖着疲惫的身体回家,还要面对地板上那些难缠的灰尘、污渍,真是非常让人头疼。不过,洗地机的出现就像是给家务清洁装上了智能引擎&…

idea中maven全局配置

配置了就不需要每次创建项目都来设置maven仓库了。 1.先把项目全关了 2. 进入全局设置 3.设置maven的仓库就可以了

一篇文章带你完全理解C语言数组

文章目录 1.一维数组的创建和初始化数组的创建1.2数组的初始化1.3 一维数组的使用1.4一维数组在内存中的存储 2.二维数组的创建和初始化2.1二维数组的创建2.2 二维数组的初始化2.3 二维数组的使用2.4 二维数组在内存中的存储 3.数组越界4.数组作为函数参数4.1 冒泡排序函数的错…

从零开始开发美颜SDK:打造属于平台的主播美颜工具

本篇文章,小编将从零开始,介绍如何打造一款属于平台的主播美颜工具。 一、需求分析 首先,明确开发美颜SDK的需求是至关重要的。当前市场上,美颜工具的功能主要包括: 1.实时美颜:磨皮、美白、瘦脸等基础功…

Static关键字的用法详解

Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java编程语言中,static是一个关键字,它可以用于多种上…

项目机会:4万平:智能仓,AGV,穿梭车,AMR,WMS,提升机,机器人……

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 如下为近期国内智能仓储物流相关项目的公开信息线索,这些项目具体信息会发布到知识星球,请感兴趣的球友先人一步到知识星球【智能仓储物流技术研习社】自行下载…

时钟系统框图(时钟树)解析

时钟系统框图(时钟树)解析 文章目录 时钟系统框图(时钟树)解析1、时钟树2、 4个时钟源:$HSI、HSE、LSI、LSE$3、PLL锁相环倍频输出4、系统时钟的来源5、Enable CSS(时钟监视系统)6、几个重要的时…

微信开发者工具使用

1.下载微信开发者工具 https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html 2.下载小程序项目代码 3.用微信开发者工具导入项目代码 4.npm安装依赖 5.构建 6.修改测试环境 7.清除缓存 观察切换test后,登录时是否test字样提醒,若…

使用Python+OpenCV实现姿态估计--20240705

姿态估计使用Opencv+Mediapipe来时实现 什么是Mediapipe? Mediapipe是主要用于构建多模式音频,视频或任何时间序列数据的框架。借助MediaPipe框架,可以构建令人印象深刻的ML管道,例如TensorFlow,TFLite等推理模型以及媒体处理功能。 安装命令: pip install mediapipe如果…

大模型提示词工程和落地思考

本文是一篇内部的个人分享(已无敏感信息) ,目的是增加产品、开发同学对 LLM 的理解,以降低沟通中的阻力,更好推进落地。 以下经脱敏后的原文: 大模型并不神奇 很多人听到’大模型’这个词可能会觉得很神秘&#xff…

centos7固定ip

1.查看虚拟网络配置 2.修改网卡配置文件 [jiajinglocalhost ~]$ su - Password: Last login: Thu Jul 4 19:06:16 PDT 2024 on pts/0 [rootlocalhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ON…

倘若你的的B端系统如此漂亮,还担心拿不出手吗,尤其是面对客户

如果你的B端系统设计如此漂亮,那么通常来说,你不太需要担心在客户那里拿不出手。一个漂亮和易用的设计可以提升用户体验,增加客户对系统的满意度。 然而,还是有一些因素需要考虑,以确保你的B端系统在客户那里能够得到良…

综合项目实战--jenkins流水线

一、流水线定义 软件生产环节,如:需求调研、需求设计、概要设计、详细设计、编码、单元测试、集成测试、系统测试、用户验收测试、交付等,这些流程就组成一条完整的流水线。脚本式流水线(pipeline)的出现代表企业人员可以更自由的通过代码来实现不同的工作流程。 二、pi…

【夏季跨境】7-9月热门类目选品指南(附自用选品工具免费插件)

一、夏季跨境热门类目及品类 1 、运动与户外 随着夏季的到来,户外活动变得更加频繁,运动和户外装备的需求显著上升 自行车配件 自行车部件:踏板、自行车配件存储、自行车灯、自行车手机支架 整车及相关配件:成人/儿童自行车、…

JavaEE——计算机工作原理

冯诺依曼体系(VonNeumannArchitecture) 现代计算机,大多遵守冯诺依曼体系结构 CPU中央处理器:进行算术运算与逻辑判断 存储器:分为外存和内存,用于存储数据(使用二进制存储) 输入…

【python】OpenCV—Nighttime Low Illumination Image Enhancement

文章目录 1 背景介绍2 代码实现3 原理分析4 效果展示5 附录np.ndindexnumpy.ravelnumpy.argsortcv2.detailEnhancecv2.edgePreservingFilter 1 背景介绍 学习参考来自:OpenCV基础(24)改善夜间图像的照明 源码: 链接&#xff1a…

Golang 数组+切片+映射

数组 什么是数组 数组是一种数据类型,属于值类型数组可以存放多个同一类型数据 数组定义 var 数组名 [数组大小]数据类型 var a [5]int数组初始化的4种方式 var numArray01 [3]int [3]int{1,2,3} var numArray02 [3]int{1,2,3} var numArray03 [...]int{1,2…

直接更新flowable数据库的流程定义信息的一种方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

servlet学校会场预约系统-计算机毕业设计源码72972

摘要 学校会场预约是学校管理中的重要环节,但传统的手工预约方式存在效率低下和信息不准确等问题。为了提高预约效率和减少管理成本,许多学校开始采用基于Servlet技术的会场预约系统。本论文旨在设计和实现一种高效的Servlet学校会场预约系统&#xff0c…