数据结构-队列(带图详解)

目录

队列的概念

画图理解队列

代码图理解

代码展示(注意这个队列是单链表的结构实现)

Queue.h(队列结构)

Queue.c(函数/API实现)

main.c(测试文件)


队列的概念

队列(Queue)是一种基础的数据结构,它遵循先进先出(First In First Out, FIFO)的原则。这意味着最早进入队列的元素也将是最先离开队列的元素。队列常被比喻为现实生活中的排队场景,比如在超市收银台前排队结账,先到的人先结账。

队列有两个主要的操作:

  1. 入队(Enqueue):将一个元素添加到队列的末尾。这相当于一个人加入到队伍的最后面。
  2. 出队(Dequeue):从队列的前端移除一个元素,并返回该元素。这相当于队伍最前面的人完成相应操作后离开队伍。

画图理解队列

        这就是队列的一个基本结构,队尾入队,队头出队。在生活中也有这样的结构,请个看例图(希望可以给你带来印象):

生活中队列的例子非常普遍,以下是一些典型的实例:

  1. 超市结账:顾客在超市收银台前排队等待付款,先到的顾客先完成结账离开,后来的顾客依次跟进。

  2. 银行服务窗口:客户在银行的服务窗口前排队办理业务,遵循先来先服务的原则。

  3. 公共交通:在公交站、火车站或地铁站的候车队伍,乘客按照到达的先后顺序上车。

  4. 餐厅排队:在餐厅,特别是快餐店,顾客排队等待点餐和取餐,先排队的顾客先完成点餐流程。

  5. 打印机任务队列:在办公室,多个人提交打印任务时,打印机会按照任务提交的顺序依次执行打印。

  6. 医院挂号:病人在医院挂号处排队等待挂号,通常也是按照到达顺序进行服务。

  7. 网上购票系统:虽然看不见实体队伍,但在高峰时段购买热门活动或交通工具票务时,请求会被按接收顺序处理。

  8. ATM机取款:人们在ATM机前排队取现金,每个人完成交易后下一个人才能使用。

代码图理解

代码展示(注意这个队列是单链表的结构实现)

数据结构:单链表-CSDN博客文章浏览阅读1.6k次,点赞36次,收藏15次。链表是一种基本的数据结构,它用于存储一系列元素(节点),每个节点不仅包含数据元素,还包含一个指向下一个节点的指针。在链表中,数据并非连续地存储在内存中,而是通过每个节点的指针链接起来形成一个逻辑上的线性序列通过前面我们学习的顺序表我们现在延伸一个链表我们会发现顺序表的一些缺点。https://blog.csdn.net/2302_78381559/article/details/137829309

Queue.h(队列结构)

#pragma once
/*--头文件--*/
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int DataType;
//创建队列结构
typedef struct QueueNode
{
	struct QueueNode* Next;
	DataType val;
}QueueNode;
//创建一个结构体来确定头/尾,可以避免使用二级指针,也可以用哨兵来避免使用二级指针
typedef struct Queue {
	QueueNode* head;//头
	QueueNode* tail;//尾
	int size;//计数
}Queue;

/*--函数实现--*/
//初始化
void Q_Init(Queue* p);
//入队
void Q_Push(Queue* p, DataType x);
//出队
void Q_Pop(Queue* p);
//节点数
int Q_Size(Queue* p);
//获取头部
DataType Q_Front(Queue* p);
//获取尾部
DataType Q_Back(Queue* p);
//判断是否为空
bool Q_Empty(Queue* p);
//销毁
void Q_Destroy(Queue* p);

Queue.c(函数/API实现)

#define _CRT_SECURE_NO_WARNINGS 1
//函数实现
#include"Queue.h"

//初始化
void Q_Init(Queue* p) {
	//断言
	assert(p);
	//初始化结构体
	p->head = NULL;
	p->tail = NULL;
	p->size = 0;
}

//入队
void Q_Push(Queue* p, DataType x) {
	//开辟一个节点
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)//判断是否开辟成功
	{
		assert("malloc");
		return;
	}
	//进行插入操作
	newnode->Next = NULL;
	newnode->val = x;
	if (p->tail == NULL)
	{
		p->head = p->tail = newnode;
	}
	else
	{
		p->tail->Next = newnode;
		p->tail = newnode;//更新tail的指向
	}

	p->size++;//push一下节点个数++
}

//出队
void Q_Pop(Queue* p) {
	assert(p);
	assert(p->size);//节点不能为空

	//进行出队
	if (p->head->Next == NULL)//一个节点
	{
		free(p->head);
		p->head = p->tail = NULL;
	}
	else//多个节点
	{
		QueueNode* tmp = p->head->Next;//用临时变量存储head的下一个节点
		free(p->head);//释放head的节点
		p->head = tmp;//在更新head指向
	}
	p->size--;//pop一个节点个数--
}

//节点数
int Q_Size(Queue* p) {
	assert(p);
	assert(p->size);
	return p->size;
}

//获取头部
DataType Q_Front(Queue* p) {
	assert(p);
	assert(p->size);
	//直接返回head的元素
	return p->head->val;
}
//获取尾部
DataType Q_Back(Queue* p) {
	assert(p);
	assert(p->size);
	//直接返回tail的元素
	return p->tail->val;
}

//判断是否为空
bool Q_Empty(Queue* p) {
	assert(p);
	//return p->size == 0;
	return !p->size;
}
//销毁
void Q_Destroy(Queue* p) {
	assert(p);
	QueueNode* cur = p->head;
	while (cur)
	{
		//存储下一个位置
		QueueNode* tmp = cur->Next;
		free(cur);
		cur = tmp;
	}
	//指针制空
	p->head = p->tail = NULL;
	p->size = 0;
}

main.c(测试文件)

#define _CRT_SECURE_NO_WARNINGS 1
//测试
#include"Queue.h"
#if 0
int main1() {
	Queue s1;
	Q_Init(&s1);
	Q_Push(&s1, 1);
	Q_Push(&s1, 2);
	Q_Push(&s1, 3);
	Q_Push(&s1, 4);
	while (!Q_Empty(&s1))
	{
		printf("%d ", Q_Front(&s1));
		Q_Pop(&s1);
	}
	Q_Destroy(&s1);
}
#endif // 0


int main() {

	//测试一个数据
	Queue s1;
	Q_Init(&s1);
	Q_Push(&s1, 1);
	Q_Push(&s1, 2);
	Q_Push(&s1, 3);

	while (!Q_Empty(&s1))
	{
		printf("%d ", Q_Front(&s1));
		Q_Pop(&s1);
	}
	Q_Destroy(&s1);
}

 

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

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

相关文章

中兴通讯携手AIS,助力泰国5G通信事业发展

前不久&#xff0c;中兴通讯携手泰国领先的移动运营商AIS&#xff0c;于泰国曼谷A-Z中心宣布商用部署中兴通讯最新一代的无线先锋产品。双方通力合作&#xff0c;将构建一个绿色、极简的智能5G通信网络&#xff0c;助力泰国5G通信事业发展。    新一代Super-N技术&#xff0c…

【R语言】获取任意颜色的HTML 颜色代码、十六进制颜色代码、 RGB代码

网站来源&#xff1a; https://htmlcolorcodes.com/ 界面如下所示&#xff1a; 通过鼠标任意选择不同的颜色&#xff0c;就能获取该色的十六进制代码、RGB代码等。 除此之外&#xff0c;还提供了一些常用颜色的便捷选项,如下&#xff1a; 任意选择一种颜色&#xff0c;即可出…

5月27日

思维导图 #include <iostream>using namespace std; namespace st_open {string a1;string retval(string a1);} using namespace st_open; int main() {getline(cin,a1);cout << "逆置前的字符串&#xff1a;" << a1 << endl;a1rerval(a1);…

心电信号降噪方法(滤波器/移动平均/小波等,MATLAB环境)

对于一个正常的、完整的心动周期&#xff0c;对应的心电图波形如下图所示&#xff0c;各个波形都对应着心脏兴奋活动的生理过程&#xff0c;包含P波&#xff0c;PR段&#xff0c;QRS波群&#xff0c;ST段&#xff0c;T波&#xff0c;U波。 &#xff08;1&#xff09;P波心电图中…

Python3 笔记:Python之禅

打开Python Shell&#xff0c;输入import this&#xff0c;按回车键运行程序。 Beautiful is better than ugly. 优雅胜于丑陋。 Explicit is better than implicit. 明确胜于含糊。 Simple is better than complex. 简单胜于复杂。

ThingsBoard网关在燃气泄漏监测中的应用

据不完全统计&#xff0c;全国城市燃气企业的供销差率大约在3%~4%&#xff0c;也就意味着越多的天然气销量就有越多的天然气损失。城市燃气企业计量管理已经接近最不利的状态&#xff0c;开展有效的计量管理势在必行。 智慧燃气综合管理系统 在燃气管网中部署智能传感器、数据采…

Centos 7 安装刻录至服务器

前言 在日常测试中&#xff0c;会遇到很多安装的场景&#xff0c;今天给大家讲一下centos 7 的安装&#xff0c;希望对大家有所帮助。 一.下载镜像 地址如下&#xff1a; centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…

linux centos磁盘清理相关

清理磁盘流程 1、查看磁盘挂载路径及使用率 df -h2、查看当前文件下文件大小 du -sh *3、制空文件内容 > 文件名 ###制空当前文件内容&#xff0c;直接清0 列子 >access.loglinux操作系统中&#xff0c;经常会遇到磁盘空间满的问题。遇到这样的问题&#xff0c;先查下…

海外仓erp系统是什么?和海外仓管理系统一样吗?

为了满足海外仓全球化发展的大趋势&#xff0c;同时提升海外仓运转的效率&#xff0c;一套好用&#xff0c;性价比高的海外仓管理系统还是非常重要的。 不过很多海外仓企业其实不太分得清erp系统和海外仓管理系统的差异&#xff0c;今天我们就来系统的聊一下&#xff0c;方便大…

5.27周报

这两周邻近毕业故没有很多时间来学习课余内容&#xff0c;另外最近身体有些不舒服【偏头痛】&#xff0c;所以学的内容不多&#xff0c;包括SVM向量机和ResNet【不包括代码复现】 1.SVM支持向量机的大概内容 1、目的&#xff1a; 主要内容是如何找到分类的那条线【超平面】—…

二叉搜索树与双向链表(C++)

文章目录 1. 题目描述2.题目解析 题目来源&#xff1a; 牛客网…二叉搜索树与双向链表 1. 题目描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 数据范围&#xff1a;输入二叉树的节点数 0≤n≤1000&#xff0c;二叉树中每个节点的值…

函数调用时长的关键点:揭秘参数位置的秘密

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、默认参数的秘密 示例代码 二、关键字参数与位置参数的舞蹈 示例代码 总结 一、默认参…

一键开关机电路

大家好&#xff0c;我是记得诚。 球友问了一个问题&#xff0c;是这样的。 诚哥&#xff0c;请教一个问题。这个一键开关机有没有问题&#xff0c;或者有哪些改进的地方。 1、内部电源供电&#xff0c;可外接适配器。 2、VBAT接锂电池&#xff0c;VBUS接电源适配器。 3、BU…

Spring:IoC容器(基于注解管理bean)

1. HelloWorld * 引入依赖* 开启组件扫描* 使用注解定义 Bean* 依赖注入 2.开启组件扫描 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/20…

系统管理、磁盘分区

系统管理 业务层面&#xff1a;为了满足一定的需求所做的特定操作。 硬盘是什么&#xff0c;硬盘的作用&#xff1a; **硬盘&#xff1a;**计算机的存储设备&#xff0c;机械硬盘是由一个或者多个磁性的盘组成&#xff0c;可以在盘片上进行数据的读写。 连接方式&#xff1a…

【CGAL】Region_Growing 检测平面并保存

目录 说明一、算法原理二、代码展示三、结果展示 说明 本篇博客主要介绍CGAL库中使用Region_Growing算法检测平面的算法原理、代码以及最后展示结果。其中&#xff0c;代码部分在CGAL官方库中提供了例子。我在其中做了一些修改&#xff0c;使其可以读取PLY类型的点云文件&…

解析边缘计算网关的优势-天拓四方

随着信息化、智能化浪潮的持续推进&#xff0c;计算技术正以前所未有的速度发展&#xff0c;而边缘计算网关作为其中的重要一环&#xff0c;以其独特的优势正在逐步改变我们的生活方式和工作模式。本文将详细解析边缘计算网关的优势。 首先&#xff0c;边缘计算网关具有显著的…

Python 文件操作指南:使用 open 和 with open 实现高效读写

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 本系列文章主要分享文件操作&#xff0c;了解如何使用 Python 进行文件的读写操作&#xff0c;介绍常见文件格式的读取和写入方法&#xff0c;包括TXT、 CS…

开源博客项目Blog .NET Core源码学习(27:App.Hosting项目结构分析-15)

本文学习并分析App.Hosting项目中后台管理页面的角色管理页面。   角色管理页面用于显示、检索、新建、编辑、删除角色数据同时支持按角色分配菜单权限&#xff0c;以便按角色控制后台管理页面的菜单访问权限。角色管理页面附带一新建及编辑页面&#xff0c;以支撑新建和编辑…

【MATLAB源码-第215期】基于matlab的8PSK调制CMA均衡和RLS-CMA均衡对比仿真,对比星座图和ISI。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 CMA算法&#xff08;恒模算法&#xff09; CMA&#xff08;Constant Modulus Algorithm&#xff0c;恒模算法&#xff09;是一种自适应盲均衡算法&#xff0c;主要用于消除信道对信号的码间干扰&#xff08;ISI&#xff09;…