队列的讲解与实现

这里写目录标题

  • 一、队列的概念及结构
  • 二、队列的实现(使用VS2022的C语言)
    • 1.初始化、销毁
    • 2.入队、出队
    • 3.返回队头元素、返回队尾元素、判空、返回有效元素个数
  • 三、完整 Queue.c 源代码

一、队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 的原则

入队列:进行插入操作的一端称为队尾。
出队列:进行删除操作的一端称为队头。

第一次入队:
在这里插入图片描述
正常入队:
在这里插入图片描述
正常出队:
在这里插入图片描述
只剩最后一个元素时出队:
在这里插入图片描述

二、队列的实现(使用VS2022的C语言)

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

队列常用的接口包括:

1.初始化、销毁

2.入队、出队

3.返回队头元素、返回队尾元素、判空、返回有效元素个数

在 Queue.h 中:

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

typedef int QDataType;

typedef struct QListNode
{
	QDataType data;				// 数据
	struct QListNode* next;		// 保存下一元素地址的指针变量
} QListNode, * pQListNode;

typedef struct Queue
{
	pQListNode front;			// 队头指针变量
	pQListNode rear;			// 队尾指针变量
	int size;					// 有效元素个数
} Queue, * pQueue;

// 初始化、销毁
void QueueInit(pQueue pque);

void QueueDestroy(pQueue pque);

// 入队、出队
void QueuePush(pQueue pque, QDataType x);

void QueuePop(pQueue pque);

// 返回队头元素、返回队尾元素
QDataType QueueFront(pQueue pque);

QDataType QueueBack(pQueue pque);

// 判空、返回有效元素个数
bool QueueEmpty(pQueue pque);

int QueueSize(pQueue pque);

1.初始化、销毁

// 初始化、销毁
void QueueInit(pQueue pque)
{
	assert(pque);

	pque->size = 0;
	pque->front = pque->rear = NULL;
}

void QueueDestroy(pQueue pque)
{
	assert(pque);

	// 从队头开始删数据
	while (pque->front)
	{
		pQListNode temp = pque->front->next;
		free(pque->front);
		pque->front = temp;
	}
	pque->rear = NULL;
	pque->size = 0;
}

2.入队、出队

// 入队、出队
void QueuePush(pQueue pque, QDataType x)
{
	assert(pque);

	pQListNode newNode = (pQListNode)malloc(sizeof(QListNode));
	newNode->data = x;
	newNode->next = NULL;

	if (pque->front == NULL)		// 队列为空时,修改队头队尾
	{
		pque->front = newNode;
		pque->rear = newNode;
	}
	else							// 只修改队尾
	{
		pque->rear->next = newNode;
		pque->rear = newNode;
	}
	++pque->size;
}

void QueuePop(pQueue pque)
{
	assert(pque);
	assert(pque->front && pque->rear);

	pQListNode temp = pque->front->next;
	free(pque->front);
	pque->front = temp;

	if (pque->front == NULL)		// 若队头删除数据后为空
	{
		pque->rear = NULL;
	}
}

3.返回队头元素、返回队尾元素、判空、返回有效元素个数

// 返回队头元素、返回队尾元素
QDataType QueueFront(pQueue pque)
{
	assert(pque && pque->front);

	return pque->front->data;
}

QDataType QueueBack(pQueue pque)
{
	assert(pque && pque->rear);

	return pque->rear->data;
}

// 判空、返回有效元素个数
bool QueueEmpty(pQueue pque)
{
	assert(pque);

	return pque->front == NULL;
}

int QueueSize(pQueue pque)
{
	assert(pque);

	return pque->size;
}

三、完整 Queue.c 源代码

#include "Queue.h"

// 初始化、销毁
void QueueInit(pQueue pque)
{
	assert(pque);

	pque->size = 0;
	pque->front = pque->rear = NULL;
}

void QueueDestroy(pQueue pque)
{
	assert(pque);

	// 从队头开始删数据
	while (pque->front)
	{
		pQListNode temp = pque->front->next;
		free(pque->front);
		pque->front = temp;
	}
	pque->rear = NULL;
	pque->size = 0;
}

// 入队、出队
void QueuePush(pQueue pque, QDataType x)
{
	assert(pque);

	pQListNode newNode = (pQListNode)malloc(sizeof(QListNode));
	newNode->data = x;
	newNode->next = NULL;

	if (pque->front == NULL)		// 队列为空时,修改队头队尾
	{
		pque->front = newNode;
		pque->rear = newNode;
	}
	else							// 只修改队尾
	{
		pque->rear->next = newNode;
		pque->rear = newNode;
	}
	++pque->size;
}

void QueuePop(pQueue pque)
{
	assert(pque);
	assert(pque->front && pque->rear);

	pQListNode temp = pque->front->next;
	free(pque->front);
	pque->front = temp;

	if (pque->front == NULL)		// 若队头删除数据后为空
	{
		pque->rear = NULL;
	}
}

// 返回队头元素、返回队尾元素
QDataType QueueFront(pQueue pque)
{
	assert(pque && pque->front);

	return pque->front->data;
}

QDataType QueueBack(pQueue pque)
{
	assert(pque && pque->rear);

	return pque->rear->data;
}

// 判空、返回有效元素个数
bool QueueEmpty(pQueue pque)
{
	assert(pque);

	return pque->front == NULL;
}

int QueueSize(pQueue pque)
{
	assert(pque);

	return pque->size;
}

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

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

相关文章

手机相册的排列方式探讨

不论你是不是程序员&#xff0c;你一定留意过一个问题&#xff1a;相册 App 基本都将图片裁剪成了居中的 1:1 正方形。那么手机相册 App&#xff0c;为什么要将图片切割成 1:1 正方形&#xff0c;然后以网格排列&#xff1f;是行业标准吗&#xff1f; 自适应图片宽度的图库&a…

vr样板房实景漫游展示制作解决了地产商难题

家具和软装销售中&#xff0c;如何直观展示产品优势一直是老板们的难题。口头描述往往难以让客户真正感受到产品的独特之处&#xff0c;这不仅影响了销售效果&#xff0c;也增加了沟通的难度。但现在&#xff0c;我们有了全新的解决方案——样板房VR全景编辑软件! 样板房VR全景…

SpringMVC:消息转换器

1. HttpMessageConvertor 简介 HttpMessageConverter是Spring MVC中非常重要的一个接口。翻译为&#xff1a;HTTP消息转换器。该接口下提供了很多实现类&#xff0c;不同的实现类有不同的转换方式。 转换器 如上图所示&#xff1a;HttpMessageConverter接口的可以将请求协议转…

数据结构之ArrayList与顺序表(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 顺序表的学习&#xff0c;点我 上面这篇博文是关于顺序表的基础知识&#xff0c;以及顺序表的实现。…

美团面试:百亿级分片,如何设计基因算法?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的架构类/设计类的场景题&#xff1a; 1.说说分库分表的基因算法&#xff1f…

【Linux】深入解析动静态库:原理、制作、使用与动态链接机制

文章目录 前言&#xff1a;1. 什么是动静态库2. 动静态库的制作和使用3. 动态库的查找问题4. 理解动态库的加载4.1. 站在系统的角度理解4.2. 编址、可执行程序4.3. 动态库动态链接和加载问题 总结&#xff1a; 前言&#xff1a; 在软件开发中&#xff0c;动静态库是两种重要的…

Netty中的ByteBuf使用介绍

ByteBuf有三类&#xff1a; 堆缓存区&#xff1a;JVM堆内存分配直接缓冲区&#xff1a;有计算机内存分配&#xff0c;JVM只是保留分配内存的地址信息&#xff0c;相对于堆内存方式较为昂贵&#xff1b;复合缓冲区&#xff1a;复合缓冲区CompositeByteBuf&#xff0c;它为多个B…

6月26~28日,2024北京国际消防展即将开幕!

随着社会的快速发展&#xff0c;消防安全日益受到广大民众的高度关注。为了进一步推动消防科技的创新与发展&#xff0c;提升全民消防安全意识&#xff0c;2024年北京消防展将于6月26日在北京国家会议中心盛大开展。目前:观众预登记已全面启动&#xff0c;广大市民和业界人士可…

Skins

本主题解释如何将DevExpress主题/皮肤应用到应用程序中&#xff0c;如何允许用户在运行时在主题之间切换&#xff0c;如何自定义现有皮肤或创建自己的皮肤&#xff0c;等等。 WinForms订阅包括许多基本控件&#xff1a;按钮、复选框、表单、消息框、对话框、对话框等。 我们实现…

python面向过程与初始面向对象编程

让我们穿越到《龙珠》世界&#xff0c;一起揭开 面向对象编程 的神秘面纱吧。 面向过程编程与面向对象编程 天下第一武道会 选手登记 第 22 届天下第一武道会即将召开&#xff0c;各路武术高手齐聚一堂&#xff0c;其中最受瞩目的&#xff0c;当属卡卡罗特&#xff08;孙悟…

Docker高级篇之Docker搭建mysql主从复制架构

文章目录 1. 安装mysql主从复制2. 主从复制测试 1. 安装mysql主从复制 首先创建主节点 docker run -d -p 3308:3306 \ --privilegedtrue \ -v /Users/jackchai/Desktop/lottory_docker/learndocker/mymysql/master/log:/var/log/mysql \ -v /Users/jackchai/Desktop/lottory_…

dots_image 增强图像中的圆点特征

dots_image 增强图像中的圆点特征 1. dot_image 有什么用途&#xff1f;2. 点状字符的特征增强3. Halcon代码 1. dot_image 有什么用途&#xff1f; Enhance circular dots in an image. 这个算子可以增强图像中的圆点特征&#xff0c;例如下面的例子。 2. 点状字符的特征增强…

【数据结构与算法 | 二叉树篇】力扣101, 104, 111,LCR144

1. 力扣101 : 对称二叉树 (1). 题 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false…

知识图谱的应用---智慧政务

文章目录 智慧政务典型应用 智慧政务 智慧政务即通过“互联网政务服务”构建智慧型政府&#xff0c;利用云计算、移动物联网、人工智能、数据挖掘、知识管理等技术&#xff0c;提高政府在办公、监管、服务、决策中的智能水平&#xff0c;形成高效、敏捷、公开、便民的新型政府&…

微前端之旅:探索Qiankun的实践经验

theme: devui-blue 什么是微前端&#xff1f; 微前端是一种前端架构方法&#xff0c;它借鉴了微服务的架构理念&#xff0c;将一个庞大的前端应用拆分为多个独立灵活的小型应用&#xff0c;每个应用都可以独立开发、独立运行、独立部署&#xff0c;再将这些小型应用联合为一个完…

3D打印随形水路:模具水路的革命性技术

在快速发展的模具制造行业中&#xff0c;3D打印技术以其独特的优势正在引领一场技术革命。其中&#xff0c;3D打印随形水路技术&#xff0c;凭借其灵活性和定制化设计的能力&#xff0c;为模具带来了前所未有的变革。 模具3D打印随形水路技术&#xff0c;是一种利用3D打印技术制…

环 境 变 量

如果希望某一个文件在 CMD 窗口的任意路径下都可以打开&#xff0c;则需要将该文件的路径存放在环境变量中。 在 CMD 中运行该文件时&#xff0c;优先查看当前路径下的文件&#xff0c;如果没有找到&#xff0c;则进入环境变量中记录的路径下寻找该文件&#xff0c;如果能找到…

阿里通义千问,彻底爆了!(本地部署+实测)

点击“终码一生”&#xff0c;关注&#xff0c;置顶公众号 每日技术干货&#xff0c;第一时间送达&#xff01; 问大家一个问题&#xff1a;你是否想过在自己的电脑上部署一套大模型&#xff1f;并用自己的知识库训练他&#xff1f; 阿里通义千问今天发布了最新的开源大模型系…

灵动岛动效:打造沉浸式用户体验

灵动岛是专属于 iPhone 14 Pro 系列交互UI&#xff0c;通过通知消息的展示和状态的查看与硬件相结合&#xff0c;让 iPhone 14 Pro 系列的前置摄像头和传感器的“感叹号”&#xff0c;发生不同形状的变化。这样做的好处是让虚拟软件和硬件的交互变得更为流畅&#xff0c;以便让…

M1Pro 使用跳板机

Mac (M1 Pro) 通过Iterm2 使用跳板机 1、由于堡垒机&#xff08;跳板机&#xff09;不能支持mac系统终端工具&#xff0c;只支持xshell等win生态。所以我们需要先安装iterm2 装iterms教程 这里头对rz、sz的配置不详细。我们可以这样配置&#xff1a; where iterm2-send-zmod…