[C语言实现]数据结构之《关于我转生成队列这档事》

news2024/10/5 14:38:14


🥰作者: FlashRider

🌏专栏: 数据结构

🍖知识概要:详解队列的概念、顺序队列和链式队列的优点和缺点,以及代码实现。

目录

什么是队列?

选择什么结构来实现队列?

链式队列的实现

队列的结构体实现

队列需要的函数声明

队列的函数实现

测试代码


什么是队列?

队列其实就是一种操作受限的线性表(即:只能在表头弹出,表尾插入)。
我们把数据的删除端称为队头,把数据的插入端称为队尾
生活中,我们在食堂打饭排队的时候,从队尾进入队列,我们前面的人打完饭后从队头离开队列。
由此可见,队列这种结构也是非常重要的,在生活中随处可见。

选择什么结构来实现队列?

我们需要对队列进行插入删除操作的时候,都是从队尾插入,队头删除,因此我们选用链式结构来实现队列(链表实现队列),如果我们采用顺序结构(顺序表)来实现队列的话,在删除之后就要进行大量的数据挪动,如果不挪动就会造成一定程度的空间浪费。

那么我们选用单链表,还是双链表来实现队列?
如果我们选择双向链表来实现队列,在进行插入删除的时候会非常轻松,但是总有一种大材小用的感觉。如果我们选用单链表实现队列,我们就要实现头删和尾插,但是尾插需要找尾,这对于单链表来说是O(n)的时间复杂度,因此我们新建一个结点tail来存储尾结点,这样尾插就是O(1)了。

链式队列的实现

需要的头文件:  stdlib.h        stdbool.h        assert.h        stdio.h

队列的结构体实现

//队列元素类型 
typedef int QDataType;
//链式队列结点
typedef struct QueueNode
{
	QDataType x;
	struct QueueNode* next;
}QNode;
//队列 
typedef struct Queue
{
	QNode* front;//队头
	QNode* tail;//队尾 
}Queue;

队列需要的函数声明

首先是老四样: 初始化、插入删除、获取长度、销毁。
其次还有:判空、获取队头元素、获取队尾元素。

void QueueInit(Queue* pq);//初始化队列 
void QueuePush(Queue* pq, QDataType x);//队尾插入元素
void QueuePop(Queue* pq);//删除队头元素
bool QueueEmpty(Queue* pq);//判断队列是否为空
int QueueSize(Queue* pq);//获取队列长度
QDataType QueueFront(Queue* pq);//获取队头元素 
QDataType QueueBack(Queue* pq);//获取队尾元素 
void QueueDestroy(Queue* pq);//销毁队列 

队列的函数实现

//初始化队列 
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->front = pq->tail = NULL;
}
//队尾插入元素 
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	//如果队列为空 front也会改变 所以特判 
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	newnode->data = x;
	newnode->next = NULL;
	if(pq->front == NULL)
		pq->front = pq->tail = newnode;
	else
	{
		pq->tail->next = newnode;
		pq->tail = pq->tail->next;
	}
}
//删除队头元素 
void QueuePop(Queue* pq)
{
	assert(!(QueueEmpty(pq)));
	//如果只有一个元素 tail也会改变 所以特判
	QNode* del = pq->front;
	if(pq->front == pq->tail)
		pq->front = pq->tail = NULL;
	else pq->front = pq->front->next;
	free(del);
}
//判断队列是否为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->front == NULL;
}
//获取队列长度 
int QueueSize(Queue* pq)
{
	assert(pq);
	int cnt = 0;
	QNode* cur = pq->front;
	while(cur)
	{
		cnt++;
		cur = cur->next;
	}
	return cnt;
}
//获取队头元素 
QDataType QueueFront(Queue* pq)
{
	assert(!QueueEmpty(pq));
	return pq->front->data;
}
//获取队尾元素 
QDataType QueueBack(Queue* pq)
{
	assert(!QueueEmpty(pq));
	return pq->tail->data;
}
//销毁队列 
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->front;
	while(cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->front = pq->tail = NULL;
}

测试代码

int main(void)
{
	Queue q;
	QueueInit(&q);
	printf("插入前QueueIsEmpty >> %d (1真0假)\n", QueueEmpty(&q));
	printf("插入后QueueSize >> %d\n\n", QueueSize(&q));
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);
	printf("插入后QueueIsEmpty >> %d (1真0假)\n", QueueEmpty(&q));
	printf("插入后QueueSize >> %d\n\n", QueueSize(&q));
	while(!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}
	printf("\n");
	printf("全部弹出后QueueIsEmpty >> %d (1真0假)\n", QueueEmpty(&q));
	printf("全部弹出后QueueSize >> %d\n", QueueSize(&q));
	return 0;
}

运行结果:

如果这篇博客对您有帮助的话,请记得点个赞或者三连。 


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

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

相关文章

在UE中使用Stencil功能

Stencil是指利用深度buffer的后8位数据进行bit mask信息的绘制,从而制作类似角色mask遮罩等效果,下面就在UE中进行制作。 1.首先在Project Settings项目设置中开启stencil,搜索stencil关键字在Custom Depth Stencil Pass选项中设置为Enabled…

PNAS:勘探地球物理学论文

阅读 《Sensing prior constraints in deep neural networks for solving exploration geophysical problems dendrimers》 题目译为《深度神经网络中用于解决勘探地球物理问题的感知先验约束》 研究意义 该研究提出三种可能的策略,以有效地讲地质和/或地球物理约…

面试官再问分布式事务,三天吃透这份至尊级学习笔记怼他

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式…

ABAP 新语法--Open SQL(草稿)

1. 常量 1.1 常量赋值 常量字段可以用来为内表中的部分字段赋初始值,字段类型和长度依据输入常量的值决定 SELECTmara~matnr, " 物料号mara~matkl, " 物料组mara~mtart, " 物料类型 AS lkenz, " 删除标识,常量空字符串123 AS fla…

QCon高分演讲:火山引擎容器技术在边缘计算场景下的应用实践与探索

近日,火山引擎边缘云原生团队的同学在QCon全球软件开发大会上分享了火山引擎容器技术在边缘计算场景下的应用实践与探索,并在一众AIGC、LLM等当下热门议题中脱颖而出,入选观众满意度投票中“叫好又叫座议题Top5”。 以下是演讲全文&#xff1…

论文阅读 Interpretable Unified Language Checking

本文提出了一种新的方法来解决多种自然语言处理任务中的问题,包括公平性检查、事实检查、虚假新闻检测和对抗攻击检测等。该方法基于大型语言模型和少量人类标注的提示信息,通过在模型中引入相应的提示,来提高模型的性能和可解释性。该论文的…

数据库索引及优化

索引 1.索引简介 1.1 概念 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引的本质:索引是数据结构。 注:在数据之外,数据库系统还维护着满足特定查找算法的数据结构&…

第二章---感知机

🌞欢迎来到深度学习的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误&#xff…

centos各个版本jenkins部署

目录 官网安装方法 安装java,**注意java版本,新版本jenkins只支持jdk11及以上 安装jenkins Jenkins启动失败的七个问题 jenkins 部署脚本 Nginx转发jenkins服务 官网安装方法 Redhat Jenkins Packages (jenkins-ci.org)https://mirrors.jenkins-c…

微信朋友圈怎么定时发送?微信朋友圈定时发送有什么优势?

刷朋友圈已经成为大部分人日常中不可缺少的一件事,同时也是企业用来触达客户的重要渠道。下面一起来了解一下微信朋友圈定时发送的优势有哪些,还有怎么定时发朋友圈吧。 定时发朋友圈的优势有哪些? 1、让企业能够更好地管理自己的宣传信息 …

HttpRunner 接口自动化测试框架实战,打造高效测试流程

简介 2018年python开发者大会上,了解到HttpRuuner开源自动化测试框架,采用YAML/JSON格式管理用例,能录制和转换生成用例功能,充分做到用例与测试代码分离,相比excel维护测试场景数据更加简洁。在此,利用业…

Tree of Thoughts: Deliberate Problem Solving with Large Language Models

思维树:用大模型深思熟虑的解决问题 Tree of Thoughts: Deliberate Problem Solving with Large Language Models概述:核心思想:背景:IO promptingCoTCoT-SC 算法流程:主要实验对象:24点游戏创意写作填字游…

Linux5.3 Haproxy搭建Web群集

文章目录 计算机系统5G云计算第四章 LINUX Haproxy搭建Web群集一、Keepalived 概述1. HAProxy的主要特性2.常见的 Web 集群调度器3.HAProxy负载均衡策略4.LVS、Nginx、HAproxy的区别 二、Haproxy搭建 Web 群集 Keepalived部署高可用集群1.haproxy 服务器部署,配置负…

Linux shell脚本命令记录

1、cut cut 命令可以从一个文本文件或者文本流中提取文本列。 选项与参数: -d :后面接分隔字符。与 -f 一起使用; -f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思; -c &#x…

如何进行App性能测试?iTest工具助力你轻松实现!

目录 引言 功能简介 基本功能使用说明 其它功能 iTest数据上传功能 iTest使用注意事项 引言 如何使用iTest工具进行App性能测试。 在如今这个高度竞争的移动应用市场中,用户对于应用程序的体验需求越来越高,而良好的性能表现则是实现这一目标的关…

CleanMyMac X 4.13.4 Mac系统老牌清洁工具大测评-功能、优缺点盘点

CleanMyMac X 4.13.4 for Mac 是一款可靠且功能强大的Mac清洁工具工具,他可以让你随时检查Mac电脑的健康情况,并删除电脑中的垃圾文件,来腾出存储空间,保持Mac系统的整洁。至问世以来,CleanMyMac 系统倍受国内外用户推…

SpringBoot 源码分析刷新应用上下文(3)-refreshContext

一:入口 /*** Run the Spring application, creating and refreshing a new* {link ApplicationContext}.* param args the application arguments (usually passed from a Java main method)* return a running {link ApplicationContext}*/public ConfigurableAp…

高阶复杂网络重建:从时间序列中重建高阶网络

论文链接:https://www.nature.com/articles/s41467-022-30706-9 一、为什么要研究高阶网络? 复杂网络跟我们生活息息相关,例如社交网络的信息传播,疾病的感染扩散和基因调控网络的相互作用等。越来越多的研究突破了传统网络中两…

SSH暴力破解

Linux是开源系统,系统本身因漏洞造成的攻击相对比较少,主要集中在SSH攻击; SSH所采用的加密机制,可以防止数据传输过程中信息泄露; SSH基于用户名密码的身份验证,容易遭受密码暴力破解攻击; S…

上海交通大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 上海交通大学(A)考研难度(☆☆☆☆☆) 上海交通大学电子信息与电气工程学院的前身可溯源至1908年的电机专科,享有中国电气工程师“摇篮”的美称,…