【C语言】实现队列


目录

(一)队列

 (二)头文件

(三) 功能实现

(1)初始化

(2) 销毁队列

(3) 入队

(4)出队 

(5)得到队头的数据 

(6)得到队尾的数据

(7)判断队列是否为空

(8)得到队列内数据个数 


正文开始:

(一)队列

        队列是一种数据结构,其中元素按照先进先出(FIFO)的顺序进行操作。在队列中,新元素被插入到队列的尾部,而删除元素发生在队列的头部。

        队列可以用于处理任务或事件的顺序,例如处理请求、消息传递等。可以将任务或事件放入队列的尾部,并按照它们被放入队列的顺序进行处理。

        队列的常见操作包括入队(向队列尾部添加元素)、出队(从队列头部删除元素)、获取队列头部的元素(但不删除)、判断队列是否为空等。

        队列可以用数组或链表实现。使用数组实现的队列称为顺序队列,使用链表实现的队列称为链式队列。顺序队列的插入和删除操作会涉及元素的移动,而链式队列不需要移动元素,因此插入和删除操作的时间复杂度都是O(1)。

 (二)头文件

         队列可以使用链表实现,也可以使用顺序表实现,但是队列需要频繁的头删,顺序表的头删效率低,由于队列规定了队头出,队尾进,所以顺序表的随机访问功能在队列中用不到;而链表的头删与尾插效率高,适合实现队列,因此本文用链表实现队列。


         什么是SLT?

SLT库 

        STL(Standard Template Library)是C++的标准库,提供了一组通用数据结构和算法的模板,可以方便地用于各种应用程序的开发。

        STL包含了多个模块,其中最重要的被称为容器(Containers)、算法(Algorithms)和迭代器(Iterators)。

        容器模块包括了多种数据结构,如向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等。这些容器提供了不同的数据组织方式和操作,可以根据需要选择合适的容器进行数据存储和访问。

        算法模块包含了多种常用算法,如排序、查找、合并、遍历等。这些算法可以用于各种数据结构上,无需重复实现,只需直接调用相应的算法函数即可。

        迭代器模块提供了一种通用的访问容器元素的方式,通过迭代器可以遍历容器中的元素,并进行读取、修改等操作。迭代器相当于一个指针,可以指向容器中的某个位置,通过迭代器可以直接访问容器中的元素。

 

        本文根据Cpp的STL库来实现队列(Queue)的相关功能:包括队列初始化,销毁,向队列中插入数据(入队),删除数据(出队),得到队列的头数据(front),得到队列的尾数据(tail),判断队列是否为空,得到队列内数据个数等共八项功能接口。

这里不加解释的给出头文件,根据头文件来实现队列的具体功能:

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>/*		基于链表实现队列,入数据的为队尾,出数据的为队头*		顺序表实现队列头删效率低*		顺序表的随机访问队列中用不到*		所以选择用链表实现队列
*/
//队列存储数据类型
typedef int QueueDatatype;//队列的一个节点
typedef struct QueueNode
{QueueDatatype data;struct QueueNode* next;
}QNode;//一个队列
typedef struct Queue
{QNode* phead;//指向队列头的指针QNode* ptail;//指向队列尾的指针int size;    //队列内数据个数
}Queue;//初始化队列
void Qinit(Queue* pq);//销毁队列
void QDestroy(Queue* pq);//向队列插入数据
void Qpush(Queue* pq,QueueDatatype x);//删除队列的数据
void Qpop(Queue* pq);//得到front数据
QueueDatatype Qfront(Queue* pq);//得到tail数据
QueueDatatype Qback(Queue* pq);//判断队列是否为空
bool Qempty(Queue* pq);//得到队列内数据个数
int Qsize(Queue* pq);

(三) 功能实现

(1)初始化

队列初始化

        首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        将队列的头尾指针都置空,表示此时队列内没有任何数据,数据个数(size)置0;


//初始化队列
void Qinit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}

(2) 销毁队列

销毁队列

        首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        创建pcur指针,遍历链表;

        创建next指针,保存下一个节点,防止释放此节点后,无法解引用找到下一个节点;

        最后,分别指向队头与队尾的phead与ptail指针要置空;


//销毁队列
void QDestroy(Queue* pq)
{assert(pq);QNode* pcur = pq->phead;while (pcur){QNode* next = pcur->next;free(pcur);pcur = next;}pq->ptail = pq->phead = NULL;
}

(3) 入队

入队

         首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        入队时,队列有两种状态:

        若队列为空(此时队头队尾都为空),让头指针和尾指针都指向新节点newnode;

        若队列不为空,执行尾插;

        不要忘记让队列的size++;


//向队列插入数据
void Qpush(Queue* pq, QueueDatatype x)
{assert(pq);//获取新节点QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail!");return;}newnode->data = x;newnode->next = NULL;//队列为空,此时队头队尾都为空if (pq->phead == NULL){assert(pq->ptail == NULL);//防止一个为NULL一个不为NULL的情况pq->phead = pq->ptail = newnode;}else//队列不为空,尾插{pq->ptail->next = newnode;pq->ptail = newnode;}//队列节点数加一pq->size++;
}

(4)出队 

出队

          首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        判断队列不为空,通过assert断言实现;

        执行头删,创建next指针保存phead的next节点,freephead后,通过next找到新的头节点;

        不要忘记队列的size--;


//删除队头的数据
void Qpop(Queue* pq)
{assert(pq);assert(!Qempty(pq));QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;pq->size--;
}

        

(5)得到队头的数据 

        首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        直接返回即可;


//得到front数据
QueueDatatype Qfront(Queue* pq)
{assert(pq);return pq->phead->data;
}

 

(6)得到队尾的数据

 

        首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

        直接返回即可;


//得到tail数据
QueueDatatype Qback(Queue* pq)
{assert(pq);return pq->ptail->data;
}

 

(7)判断队列是否为空

         返回判断表达式的结果;(若队列为空,返回真(1),否则返回假(0))

 

/判断队列是否为空
bool Qempty(Queue* pq)
{//队列为空,返回真;非空,返回假return pq->size == 0;
}

 

(8)得到队列内数据个数 

         直接返回队列的size即可;


//得到队列内数据个数
int Qsize(Queue* pq)
{return pq->size;
}


完 ~

未经作者同意禁止转载

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

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

相关文章

centos7系列:出现ZooKeeper JMX enabled by default这种错误的解决方法

出现ZooKeeper JMX enabled by default这种错误的解决方法 前言一 问题描述二 解决方法2.1 可能的原因分析2.2 小编的问题解决方法First&#xff1a;检查/etc/profile里面zookeeper的环境变量配置Second&#xff1a;检查 zookeeper/conf/zoo.cfg里面的dataDir的路径 总结 前言 …

【Linux内核】从0开始入门Linux Kernel源码

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[Linux内核] ❤️ 前置学习专栏&#xff1a;[Linux学习]从0到1 ⏰ 我们仍在旅途 ​ 目录 …

Midjourney绘图欣赏系列(五)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

MATLAB知识点:nchoosek函数(★★★☆☆)用来计算组合数,也能返回从向量v中抽取k个元素的所有组合

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第三…

模型 4E(交换、体验、随处、传教)理论

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。重在提升认知。聚焦体验营销。 1 模型 4E(交换、体验、随处、传教)理论的应用 1.1 4E 理论在软件产品营销中的应用 某软件公司利用 4E 理论提升软件产品的市场占有率。具体如下&#xff1a; Exchange&a…

人工智能学习与实训笔记(四):神经网络之NLP基础—词向量

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 四、自然语言处理 4.1 词向量 (Word Embedding) 4.1.1 词向量的生成过程 4.1.2 word2vec介绍 4.1.3 word2vec&#xff1a;skip-gram算法的实现 4.2 句向量 - 情感分析 4.2.1 LSTM (Long S…

C语言之日历问题

一、代码展示 #include<stdio.h> int leapyear(int year)//判断是不是闰年函数 {if (year % 4 0 && year % 100 ! 0 || year % 400 0)return 1;elsereturn 0; } int days(int year, int month, int* day)//判断一个月有几天 {if (month ! 2)return day[month…

7.JS里表达式,if条件判断,三元运算符,switch语句,断点调试

表达式和语句的区别 表达式就是可以被求值的代码比如什么a 1 语句就是一段可以执行的代码比如什么if else 直接给B站的黑马程序员的老师引流一波总结的真好 分支语句 就是基本上所有的语言都会有的if else 语句就是满足不同的条件执行不同的代码&#xff0c;让计算机有条件…

【Java程序员面试专栏 Java领域】Java虚拟机 核心面试指引

关于Java 虚拟机部分的核心知识进行一网打尽,主要包括Java虚拟机的内存分区,执行流程等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 JVM 程序执行流程 包括Java程序的完整执行流程,以及Javac编译,JIT即时编译 Java程序的完整执…

会声会影2024新功能及剪辑视频步骤教程

会声会影2024的新功能主要包括&#xff1a; 全新的标题动态与特效&#xff1a;用户可以为文字标题指定进入、中场和退出的不同动态效果&#xff0c;比如闪现进入、中场弹跳和淡出退出等&#xff0c;让文字标题更具动感。此外&#xff0c;还新增了多个标题特效&#xff0c;包括…

037-安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类

037-安全开发-JavaEE应用&JNDI注入&RMI服务&LDAP服务&JDK绕过&调用链类 #知识点&#xff1a; 1、JavaEE-JNDI注入-RMI&LDAP 2、JavaEE-漏洞结合-FastJson链 3、JavaEE-漏洞条件-JDK版本绕过 演示案例&#xff1a; ➢JNDI注入-RMI&LDAP服务 ➢JNDI注…

阿里云香港服务器cn2速度测试和租用价格表

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

YOLO v5项目实战 P5 解决运行detect文件时设置了--view-img但是显示不出来的问题

up主讲的实时显示目标检测后的图片的两种方法&#xff1a; &#xff08;1&#xff09;在下面的Terminal中输入下列命令&#xff1a; python detect.py --view-img &#xff08;2&#xff09;点击进入右上方的detect的Edit Configurations 然后在这个参数这里输入 --view img…

人工智能学习与实训笔记(八):百度飞桨套件使用方法介绍

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 八、百度飞桨套件使用 8.1 飞桨预训练模型套件PaddleHub 8.1.1 一些本机CPU可运行的飞桨预训练简单模型&#xff08;亲测可用&#xff09; 8.1.1.1 人脸检测模型 8.1.1.2 中文分词模型 8.1…

自然语言编程系列(四):GPT-4对编程开发的支持

在编程开发领域&#xff0c;GPT-4凭借其强大的自然语言理解和代码生成能力&#xff0c;能够深刻理解开发者的意图&#xff0c;并基于这些需求提供精准的编程指导和解决方案。对于开发者来说&#xff0c;GPT-4能够在代码片段生成、算法思路设计、模块构建和原型实现等方面给予开…

《数字电子电路》 课程设计:十字路口红绿灯自动控制系统(上)(multisim仿真及PCB实现)

&#xff08;一&#xff09;前言 本系列文章就笔者在大二下学期进行《数字电子线路》课程设计的题目&#xff1a;十字路口红绿灯自动控制系统 进行详细的讲解&#xff0c;希望对读者有所帮助。 &#xff08;二&#xff09;目录 一、主要指标及要求 二、电路工作原理 1、工作原…

P15---总电磁转矩T

正弦波驱动模式工作的永磁同步电动机的总电磁转矩 T clear clc% 15页表达式 syms Omega theta E I e_A E*sind(theta) e_B E*sind(theta-120) e_C E*sind(theta-240)i_A I*sind(theta) i_B I*sind(theta-120) i_C I*sind(theta-240)P e_A*i_A e_B*i_B e_C*i_CT P/Om…

Unity设备分级策略

Unity设备分级策略 前言 之前自己做的设备分级策略&#xff0c;在此做一个简单的记录和思路分享。希望能给大家带来帮助。 分级策略 根据拟定的评分标准&#xff0c;预生成部分已知机型的分级信息&#xff0c;且保存在包内&#xff1b;如果设备没有被评级过&#xff0c;则优…

QKD安全攻击防御方案分析和分级评估研究报告

今天分享的是行业报告&#xff1a;《QKD安全攻击防御方案分析和分级评估研究报告》 &#xff08;内容出品方&#xff1a;量子信息网络产业联盟&#xff09; 报告共计&#xff1a;180页 来源&#xff1a;《见鹿报告》 前言 量子通信是量子信息科学的重要分支&#xff0c;它…

Shellcode免杀对抗(Python)

Shellcode Python免杀&#xff0c;绕过360安全卫士、火绒安全、Defender Python基于cs/msf的上线 cs 执行代码2种可供选择 执行代码 1&#xff1a; rwxpage ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40) ctypes.windll.kernel32.RtlMoveMemory…