队列的讲解与实现

news2024/11/18 5:38:41

这里写目录标题

  • 一、队列的概念及结构
  • 二、队列的实现(使用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;
}

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

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

相关文章

网络空间安全数学基础·同余式

6.1 剩余系&#xff08;掌握&#xff09; 6.2 同余式概念与一次同余式&#xff08;熟练&#xff09; 6.3 中国剩余定理&#xff08;熟练&#xff09; 6.1 剩余系 设m是正整数&#xff0c;模m同余的全体整数是一个模m剩余类&#xff0c;即可表示为a qmr&#xff0c; 0≤r<…

在推荐四款软件卸载工具,让流氓软件无处遁形

Revo Uninstaller Revo Uninstaller是一款电脑软件、浏览器插件卸载软件&#xff0c;目前已经有了17年的历史了。可以扫描所有window用户卸载软件后的残留物&#xff0c;并及时清理&#xff0c;避免占用电脑空间。 Revo Uninstaller可以通过命令行卸载软件&#xff0c;可以快速…

python数据分析-问卷数据分析(地理课)

学生问卷 分析学生背景&#xff1a;班级分布、每周地理课数量、地理成绩分布 根据问卷&#xff0c;可以知道&#xff1a; 班级分布&#xff1a; 七年级有118名学生。 八年级有107名学生。 每周地理课的数量&#xff1a; 有28名学生每周有1节地理课。 有99名学生每周有2…

dots_image 增强图像中的圆点特征

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

有待挖掘的金矿:大模型的幻觉之境

人工智能正在迅速变得无处不在&#xff0c;在科学和学术研究中&#xff0c;自回归的大型语言模型&#xff08;LLM&#xff09;走在了前列。自从LLM的概念被整合到自然语言处理&#xff08;NLP&#xff09;的讨论中以来&#xff0c;LLM中的幻觉现象一直被广泛视为一个显著的社会…

CAD二次开发(8)-探索实现不重启CAD进行热部署代码

最近在研究CAD二次开发过程中&#xff0c;调试代码的过程中&#xff0c;需要频繁地重启CAD&#xff0c;非常浪费我们的开发时间&#xff0c;所以我就一直在想&#xff0c;怎么可以实现在不每次重启代码和CAD的情况下&#xff0c;实现代码的热部署效果。 我找到的方式&#xff…

论文阅读 A Distributional Framework for Data Valuation

本论文解决的问题 量化数据价值&#xff08;机器学习模型训练中各个数据点的贡献&#xff09; 避免数据价值受到其所处数据集的影响&#xff0c;使数据点的估值更加稳定、一致 变量假设 假设 D 表示一个在全集 Z 上的数据分布。对于监督学习问题&#xff0c;我们通常认为 Z…

高考志愿填报有哪些技巧和方法

一年一度高考季&#xff0c;又高考志愿填报的时侯了。高考志愿填报的时侯&#xff0c;需要考虑的因素比较多&#xff0c;有的同学觉是离家越远越好&#xff0c;要放飞自我&#xff0c;家长再也管不了我了。有的同学觉得专业比学校牌子重要&#xff0c;只要报个好专业&#xff0…

服务监控-微服务小白入门(5)

背景 什么是服务监控 监视当前系统应用状态、内存、线程、堆栈、日志等等相关信息&#xff0c;主要目的在服务出现问题或者快要出现问题时能够准确快速地发现以减小影响范围。 为什么要使用服务监控 服务监控在微服务改造过程中的重要性不言而喻&#xff0c;没有强大的监控…

【WP】猿人学_16_js逆向_window蜜罐

https://match.yuanrenxue.cn/match/16 抓包分析 荷载一个加密参数&#xff0c;一个时间戳 时间: 2024-06-07 15:52:31时间戳: 1717746751 1717746751000时间戳和现在对得上&#xff0c;直接生成就行。 追栈 追栈找m的生成位置。 点进去打断点&#xff0c;重新点击其他…

Java 8 中的 Stream API,用于处理集合数据

Java 8 引入了 Stream API&#xff0c;使得处理集合数据变得更加简洁和高效。Stream API 允许开发者以声明式编程风格操作数据集合&#xff0c;而不是使用传统的迭代和条件语句。 一、基本概念 1.1 什么是 Stream Stream 是 Java 8 中的一个新抽象&#xff0c;它允许对集合数…

Java学习笔记(六):Array List、学生管理系统、学生管理系统升级版

目录 一、ArrayList 1.1集合和数组的优势对比&#xff1a; 1.2 ArrayList类概述 1.3 ArrayList类常用方法 1.3.1 构造方法 1.3.2 成员方法 1.4 ArrayList存储字符串并遍历 1.5 ArrayList存储学生对象并遍历 1.6 查找用户的索引 1.7 添加手机对象并返回要求的数据 二…

用 Notepad++ 写 Java 程序

安装包 百度网盘 提取码&#xff1a;6666 安装步骤 双击安装包开始安装。 安装完成&#xff1a; 配置编码 用 NotePad 写 Java 程序时&#xff0c;需要设置编码。 在 设置&#xff0c;首选项&#xff0c;新建 中进行设置&#xff0c;可以对每一个新建的文件起作用。 Note…

【Flutter】 TextField限制长度时, 第三方手写输入法、ios原始拼音输入法输入被吞问题

问题描述 TextField限制长度时&#xff0c; 当你的输入字符长度已经到了最大值-1时&#xff0c;使用第三方手写输入法或者ios原生拼音输入法输入liang&#xff08;什么拼音都行&#xff0c;这里只是举例&#xff09;&#xff0c;输到i那么li都会消失。 原因分析 这是因为第三…

nginx配置WebSocket参数wss连接

目录 一、原文连接 二、 配置参数 三、实践 四、重启nginx 五、连接websocket 一、原文连接 nginx配置websocket支持wss-腾讯云开发者社区-腾讯云 二、 配置参数 map $http_upgrade $connection_upgrade { default upgrade; close; } upstream websocket { se…

PostgreSQL基础(九):PostgreSQL的事务介绍

文章目录 PostgreSQL的事务介绍 一、什么是ACID&#xff08;常识&#xff09; 二、事务的基本使用 三、保存点&#xff08;了解&#xff09; PostgreSQL的事务介绍 一、什么是ACID&#xff08;常识&#xff09; 在日常操作中&#xff0c;对于一组相关操作&#xff0c;通常…

基于t-SNE的泰坦尼克号数据集降维

目录 1. 作者介绍2. 算法介绍2.1 t-SNE介绍2.2.SNE基本原理2.3.拥挤问题2.4.t-SNE基本原理2.5.t-SNE算法过程 3. 泰坦尼克号数据集降维实验3.1.数据集介绍3.2 任务介绍3.3 代码实现3.4 实验结果 参考连接 1. 作者介绍 刘方星&#xff0c;男&#xff0c;西安工程大学电子信息学…

vue3 监听器,组合式API的watch用法

watch函数 在组合式 API 中&#xff0c;我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数 watch(ref,callback&#xff08;newValue,oldValue&#xff09;&#xff0c;option:{}) ref:被监听的响应式量&#xff0c;可以是一个 ref (包括计算属性)、一个响应式…

大型零售企业总部到分公司数据发放,有没有更优化的方案?

大型零售企业在市场经济中扮演重要角色&#xff0c;是保证基础商品生产、流通和供给的重要一环。随着企业发展&#xff0c;很多大型零售企业都会在全国、乃至全球各地开设分公司&#xff0c;用以降低生产和运营成本&#xff0c;更好地提供本地化服务。 为了保证总部与分公司间信…

【C++ | 拷贝构造函数】一文了解C++的 拷贝(复制)构造函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-07 2…