队列的特性及代码实现(C语言)

目录

队列的定义

队列的实现分析

代码实现

Queue.h

Queue.c


队列的定义

        队列是只允许在一端进行插入操作,而在另一段进行删除操作的线性表。

        首先,让我们来看一看生活中的队列,当我们去银行办理业务的时候,我们进入银行的时候,都会去取票机那里去一个专属我们的序号,当客服通过语音播报的时候,如果是我们手里拿的好嘛时,就轮到我们办理业务了。这是一种非常公平的方法,先来的人先办理业务,后来的人就只能等到前面的人办理完业务之后才到你。这种方法是非常公平的。

        我们再来看一个例子,当我们在玩电脑的时候,当电脑不知道是什么原因卡死的时候。我们可能会疯狂的点击左键,想要把我们进行的操作点出来,可是电脑却没有反应。可是过了一会,电脑突然不卡了,你就会发现出现了很多很多同样的应用或者网页,这就是当我们点击鼠标时,鼠标已经把信息传给了电脑,每一个操作都在排队等待被进行,所以说会出现很多相同的应用或者网页。

        我们可以看到,队列就像是一个单向通道,只能向前走,不能后退。

        队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端叫做队尾,允许删除的一端叫做队头。

队列的实现分析

        队列也有着两种实现方式,一种是链式结构,一种是顺序结构。相比于栈实现我们用的顺序结构,在队列中我们用链式结构来实现要好一点。

        队列使用顺序表实现的弊端:当我们从队头出数据的时候,需要改变队头的指向,随着删除的数据增多,就会出现多余的空间浪费,这是我们就需要定义一个循环队列了,而循环队列的大小是固定的,操作起来又会很不方便,所以说我们选择使用链式结构来实现队列。

        队列的链式储存结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。因为队列只在头和尾进行操作,所以说我们只需要定义两个指针,一个指向头,一个指向尾就行了。队列的插入与删除也很方便,我们只需要将删除的节点释放掉,改变头指针的指向就行,插入的时候我们只需要改变尾指针的指向就可以了。

        分析了这么多,下面就让我们来实现一下代码吧。

代码实现

Queue.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//函数声明 结构体声明
//定义数据类型
typedef int datatype;//定义节点
typedef struct QNode
{datatype data;struct QNode* next;
}QNode;typedef struct Queue
{	//头节点QNode* head;//尾节点QNode* tail;
}Queue;//队列初始化
void InitQueue(Queue* sp);//队列插入 (头删尾插)
void InsertQueue(Queue* tmp);//出队列
void  PopQueue(Queue* tmp);//销毁队列
void  DestroyQueue(Queue* tmp);//队头数据
datatype FrontQueue(Queue* tmp);//队尾数据
datatype BackQueue(Queue* tmp);//队列长度
int QueueSize(Queue* tmp);//队列是否为空
bool QueueEmpty(Queue* tmp);

Queue.c

#include "Queue.h"//函数实现//队列初始化
void InitQueue(Queue* sp)
{	assert(sp);sp->head = NULL;sp->tail = NULL;
}//链表插入 (头删尾插)
void InsertQueue(Queue* tmp,datatype x)
{assert(tmp);QNode* cur = (QNode*)malloc(sizeof(QNode));if (cur == NULL){perror("malloc fail");exit(-1);}cur->data = x;cur->next = NULL;//如果是空队列,先直接赋值if (tmp->tail ==NULL){tmp->head = cur;tmp->tail = cur;}//如果不是空队列,就尾插else{tmp->tail->next = cur;tmp->tail = cur;}
}//出队列
void  PopQueue(Queue* tmp)
{assert(tmp);//队列的头不能为空assert(tmp->head);//只有一个节点的情况if (tmp->head->next==NULL){	free(tmp->head);tmp->head =tmp->tail= NULL;}//不只有一个节点的情况else{	QNode* cur = tmp->head->next;free(tmp->head);tmp->head = cur;}
}//队头数据
datatype FrontQueue(Queue* tmp)
{assert(tmp);assert(tmp->head);return tmp->head->data;
}//队尾数据
datatype BackQueue(Queue* tmp)
{assert(tmp);assert(tmp->tail);return tmp->tail->data;
}//队列长度
int QueueSize(Queue* tmp)
{int count = 0;QNode* cur = tmp->head;//遍历队列while (cur){	count++;cur = cur->next;}//返回长度return count;
}//队列是否为空
bool QueueEmpty(Queue* tmp)
{	//是空返回true  不是空返回falsereturn tmp->head == NULL;
}//销毁队列
void  DestroyQueue(Queue* tmp)
{assert(tmp);QNode* del = tmp->head;//释放节点while (del){QNode* cur = del->next;free(del);del = cur;}del = NULL;tmp->head = tmp->tail = NULL;
}

        以上就是关于队列的实现以及我对队列的一些理解,如果有什么错误还请大家指出。

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

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

相关文章

Python的第三方库OS库

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;OS/SHUTIL 的方法描述&#x1f680;OS/SHUTIL…

不同linux账户切换不同的cuda版本

原因 由于服务器中安装了两个版本的cuda&#xff08;cuda10.1和cuda11.1&#xff09;&#xff0c;不同项目可能需要应用不同的cuda版本&#xff0c;但是自己又没有root权限或者只想在使用指定conda环境时改为用指定的cuda版本。总结起来有三种方法&#xff1a; 1、修改软链接指…

新游启航 失落的方舟台服注册指南 一文教会你方舟台服注册

新游启航&#xff01;失落的方舟台服注册指南&#xff01;一文教会你方舟台服注册 失落的方舟作为本月最受期待游戏之一&#xff0c;在上线之际许多玩家已经有点急不可待了。这款游戏是由开发商Smile gate开发的一款MMORPG类型游戏&#xff0c;这款游戏的基本玩法与其他MMORPG…

理解AdaBoost算法:简单流程概述(一)【流程理解、无数学推导】

什么是AdaBoost 算法&#xff1f; AdaBoost&#xff08;Adaptive Boosting&#xff09;算法&#xff0c;全称为 自适应提升 &#xff0c;是 一种在机器学习中用作集成方法的提升技术 。它之所以被称为自适应提升&#xff0c;因为每个实例的权重会重新分配&#xff0c;错误分类…

推荐一个远程数据库 Supabase

地址&#xff1a;Supabase | The Open Source Firebase Alternative 使用文档&#xff1a; Supabase Docs

NIUSHOP开源商城单商户V6版本:前端技术架构的深度解析

摘要&#xff1a; 本文将对NIUSHOP开源商城单商户V6版本的前端技术架构进行深度解析。NIUSHOP V6版本以其强大的多应用多插件组合设计理念、前后端完全分离的技术架构&#xff0c;以及支持多语言、多平台等特点&#xff0c;受到了市场的广泛好评。本文将详细介绍其前端技术栈的…

HOW - BFF 服务实践系列(一)

目录 一、BFF 介绍1.1 BFF 的概念1.2 为什么需要 BFF1.3 举例说明 二、适用于Web前端的BFF应该提供哪些能力2.1 接口聚合&#xff08;重要&#xff09;2.2 简化和优化的API2.3 安全和身份验证&#xff08;重要&#xff09;2.4 缓存机制2.5 错误处理和重试机制2.6 数据格式转换2…

【算法】贪心算法简介

贪心算法概述 目录 1.贪心算法概念2.贪心算法特点3.贪心算法学习 1.贪心算法概念 贪心算法是一种 “思想” &#xff0c;即解决问题时从 “局部最优” 从而达到 “全局最优” 的效果。 ①把解决问题的过程分为若干步②解决每一步时候&#xff0c;都选择当前最优解(不关注全局…

RDD实战:排序算子 - sortBy()

在本实战案例中&#xff0c;我们将使用Apache Spark的sortBy()算子来对一个包含学生信息的RDD进行排序操作。 排序规则如下&#xff1a; 首先按照性别升序排列。在性别相同的情况下&#xff0c;按照年龄降序排列。 步骤1&#xff1a;创建学生信息列表 首先&#xff0c;我们创…

基于51单片机和NRF24L01的无线温度监控设计

一、设计功能 由单片机、温度传感器、无线模块NRF24L01以及液晶显示器等构成高精度远 程无线温度监测系统。 温度显示精确到小数点后一位。 按键设定过温值&#xff0c;过温在液晶屏提示。 系统设计 三、器件选择3.1温度信号采集模块 传统的温度检测大多以热敏电阻为传感器&a…

【C++】list的使用(上)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f308;关于list&#x1f525;默认成员函数构造函数&#xff08;constructor&#xff09;析构函数&#xff08;destructor&#xff09;赋值运算符重载 &#x1…

五分钟“手撕”栈

实现代码放开头&#xff0c;供大家学习与查阅 目录 一、实现代码 二、什么是栈 三、栈的常见操作 底层实现是链表。 入栈 出栈 四、Stack的使用 五、栈的习题 第一题 第二题 第三题 第四题 第五题 第六题 第七题 六、栈、虚拟机栈、栈帧的区别 目录 一、…

Request

一、Request介绍 在计算机网络中&#xff0c;"Request"&#xff08;请求&#xff09;通常指的是客户端向服务器发送的请求消息&#xff0c;用于获取特定资源或执行特定操作。在Web开发中&#xff0c;"Request"通常指的是HTTP请求&#xff0c;用于客户端与服…

信号稳定,性能卓越!德思特礁鲨系列MiMo天线正式发布!

作者介绍 礁鲨系列天线&#xff0c;以其独特的外观设计和强大的性能&#xff0c;成为德思特Panorama智能天线家族的最新成员。这款天线不仅稳定提供5G、WIFI和GNSS信号&#xff0c;更能在各类复杂环境中展现出卓越的性能。它的设计灵感来源于海洋中的礁鲨&#xff0c;象征着力量…

内存管理【C++】

内存分布 C中的内存区域主要有以下5种 栈&#xff08;堆栈&#xff09;&#xff1a;存放非静态局部变量/函数参数/函数返回值等等&#xff0c;栈是向下增长的【地址越高越先被使用】。栈区内存的开辟和销毁由系统自动执行 堆&#xff1a;用于程序运行时动态内存分配&#xff…

电脑丢失api-ms-win-crt-runtime-l1-1-0.dll的多种修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“api-ms-win-crt-runtime-l1-1-0.dll丢失”。这个错误通常发生在Windows操作系统中&#xff0c;它表示一个动态链接库文件丢失或损坏。这个问题可能会导致某些应用程序无法正常运行&#xf…

大型企业用什么文件加密软件,五款适合企业的文件加密软件

大型企业在选择文件加密软件时&#xff0c;通常会倾向于那些能够提供全面数据保护、具有高度可定制性、易于管理且能适应复杂组织结构的解决方案。以下是一些适合大型企业使用的文件加密软件&#xff1a; 1.域智盾软件&#xff1a; 作为一款企业级文件加密软件&#xff0c;支持…

曲面细分技术在AI去衣中的创新应用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图像处理领域的应用日益广泛。其中&#xff0c;AI去衣技术因其独特的应用场景而备受瞩目。在这一技术的发展过程中&#xff0c;曲面细分技术发挥了至关重要的作用。本文将深入探讨曲面细分技术在AI去衣中的作用及其…

C语言-单精度和双精度浮点型

文章目录 一、遇到的问题二、解决方案三、问题根因float和double的区别&#xff1a; 总结-浮点数 一、遇到的问题 将NXP项目的代码移植到RH850F1K的项目上时&#xff0c;程序运行异常&#xff1a; u16Volt (uint16)((double)u16ADVal * (double)6.3) 执行到这一行程序就跑飞了…

vue3可以快速简单的操作dom元素了

再也不需要用document.getElementById("myElement")的这种方式来对dom元素进行操作了 我们需要使用模板引用——也就是指向模板中一个 DOM 元素的 ref。我们需要通过这个特殊的 ref attribute 来实现模板引用&#xff1a; <script setup> import { ref, onMo…