当前位置: 首页 > news >正文

【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;
}


完 ~

未经作者同意禁止转载

相关文章:

【C语言】实现队列

目录 &#xff08;一&#xff09;队列 &#xff08;二&#xff09;头文件 &#xff08;三&#xff09; 功能实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09; 销毁队列 &#xff08;3&#xff09; 入队 &#xff08;4&#xff09;出队 &#xff08;5&a…...

【友塔笔试面试复盘】八边形取反问题

问题&#xff1a;一个八边形每条边都是0&#xff0c;现在有取反操作&#xff0c;选择一条边取反会同时把当前边和2个邻边取反&#xff08;如果是0变为1&#xff0c;如果是1变为0&#xff09; 现在问你怎么取反能使得八条边都变为1. 当时陷入了暴力递归漩涡&#xff0c;给出一个…...

GB 18585-2023 壁纸中有害物质限量

壁纸/墙布因其色彩多样&#xff0c;图案丰富&#xff0c;施工方便&#xff0c;价格便宜等多种优势&#xff0c;广泛应用于室内装修材料&#xff0c;在国内&#xff0c;日本&#xff0c;欧美等地区非常普及。 GB 18585-2023壁纸中有害物质限量测试项目&#xff1a; 测试项目 测…...

全面的ASP.NET Core Blazor简介和快速入门

前言 因为咱们的MongoDB入门到实战教程Web端准备使用Blazor来作为前端展示UI&#xff0c;本篇文章主要是介绍Blazor是一个怎样的Web UI框架&#xff0c;其优势和特点在哪&#xff1f;并带你快速入门上手ASP.NET Core Blazor(当然这个前提是你要有一定的C#编程基础的情况&#x…...

HGAME 2024 WEEK2 Crypto WP

前言 我很菜&#xff0c;有没做出来的题目&#xff0c;带*号题为复现。 midRSA 题目&#xff1a; from Crypto.Util.number import * from secret import flagdef padding(flag):return flagb\xff*(64-len(flag))flagpadding(flag) mbytes_to_long(flag) pgetPrime(512) qg…...

Postman轻松签名,让SHA256withRSA保驾护航!

前言 在接口测试中&#xff0c;我们经常需要对请求进行签名&#xff0c;以保证数据的安全性。而SHA256withRSA是一种较为常见的签名算法&#xff0c;它可以使用私钥对数据进行签名&#xff0c;使用公钥进行验签。 但是&#xff0c;实现该算法签名可能会涉及到一些繁琐的操作&…...

C#面:简述装箱和拆箱

在C#中&#xff0c;装箱&#xff08;boxing&#xff09;和拆箱&#xff08;unboxing&#xff09;是用于在值类型和引用类型之间进行转换的过程。 装箱&#xff1a;&#xff08;Boxing&#xff09; 是将值类型转换为引用类型的过程。 将一个值类型赋值给一个对象类型时&#x…...

【Kubernetes in Action笔记】1.快速开始

在Kubernetes上运行一个程序 基础运行环境 当前的运行环境为使用虚拟机构建的单master集群。 [rootk8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 109d v1.27.1 k8s-node1 Ready …...

踩坑实录(Fourth Day)

今天开工了&#xff0c;其实还沉浸在过年放假的喜悦中……今天在自己写 Vue3 的项目&#xff0c;虽说是跟着 B 站在敲&#xff0c;但是依旧是踩了一些个坑&#xff0c;就离谱……照着敲都能踩到坑&#xff0c;我也是醉了…… 此为第四篇&#xff08;2024 年 02 月 18 日&#x…...

【python】网络爬虫与信息提取--requests库

导学 当一个软件想获得数据&#xff0c;那么我们只有把网站当成api就可以 requests库:自动爬取HTML页面&#xff0c;自动网络请求提交 robots协议&#xff1a;网络爬虫排除标准&#xff08;网络爬虫的规则&#xff09; beautiful soup库&#xff1a;解析HTML页面 工具&…...

洛谷 P8627 [蓝桥杯 2015 省 A] 饮料换购

参考代码and代码解读 #include <bits/stdc.h> using namespace std; int main() { int n; scanf("%d", &n); int dr;//drdrink; dr n;//把drink赋值于n; while (n > 2) {//剩余的总瓶盖数要大于二,才能换得下一瓶饮料; dr n…...

Academic Inquiry|投稿状态分享(ACS,Wiley,RSC,Elsevier,MDPI,Springer Nature出版社)

作为科研人员&#xff0c;我们经常会面临着向学术期刊投稿的问题。一般来说&#xff0c;期刊的投稿状态会在官方网站上进行公示&#xff0c;我们可以通过期刊的官方网站或者投稿系统查询到我们投稿的论文的状态&#xff0c;对于不同的期刊在投稿系统中会有不同的显示。 说明&am…...

1+X运维试题样卷C卷(初级)

云计算C卷 单选题(200分) 1.在OSI模型中,HTTP协议工作在第()层,交换机工作在第()层。(10分) (答案未做:0分) A、7/3 B、7/2 (正确答案) C、6/3 D、6/2 2.Linux有三个查看文件的命令,若希望在查看文件内容过程中可以用光标上下移动来查看文件内容,应使用命令。(10分…...

Spring学习笔记(二)Spring的控制反转(设计原则)与依赖注入(设计模式)

一、控制反转&#xff1a;缩写IoC 是一种设计原则&#xff0c;降低程序代码之间的耦合度 对象由Ioc容器统一管理&#xff0c;当程序需要使用对象时直接从IoC容器中获取。这样对象的控制权就从应用程序转移到了IoC容器 二、依赖注入&#xff1a;缩写DI 依赖注入是一种消除类之…...

MySQL 基础知识(四)之表操作

目录 1 约束 2 查看已有表 3 创建表 4 查看表结构 5 修改表 6 删除表 1 约束 主键约束 primary key&#xff1a;唯一&#xff0c;标识表中的一行数据&#xff0c;此列的值不可重复&#xff0c;且不能为 NULL&#xff0c;此外&#xff0c;可以多个列组成主键唯一约束 uniq…...

计算机网络——10FTP

FTP FTP&#xff1a;文件传输协议 向远程主机上传输文件或从远程主机接收文件客户/服务器模式 客户端&#xff1a;发起传输的一方服务器&#xff1a;远程主机 ftp:RFC 959ftp服务器&#xff1a;端口号为21 FTP&#xff1a;控制连接与数据连接分开 控制连接 FTP客户端与FTP服…...

javascript中的this指向

文章目录 探索 JavaScript 中的神奇之谜&#xff1a;this关键字解析this 是什么&#xff1f;为何 this如此重要&#xff1f;this 的工作原理实例解析默认绑定隐式绑定显式绑定new 绑定 探索 JavaScript 中的神奇之谜&#xff1a;this关键字解析 JavaScript&#xff0c;作为一门…...

WebServer 之 http连接处理(下)

目录 ✊请求报文--解析 流程图 && 状态机 状态机 -- 状态转移图 主状态机 从状态机 http 报文解析 HTTP_CODE 含义 从状态机 逻辑 主状态机 逻辑 &#x1f41e;请求报文--响应 基础API stat mmap iovec writev 流程图 HTTP_CODE 含义(2) 代码分析 …...

Android电量相关知识

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、 查看耗电情况3.1 注册广播 ACTION…...

【Java多线程】线程中几个常见的属性以及状态

目录 Thread的几个常见属性 1、Id 2、Name名称 3、State状态 4、Priority优先级 5、Daemon后台线程 6、Alive存活 Thread的几个常见属性 1、Id ID 是线程的唯一标识&#xff0c;由系统自动分配&#xff0c;不同线程不会重复。 2、Name名称 用户定义的名称。该名称在各种…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...