C语言实现队列

前言:在实现栈之后我们再介绍一下他的孪生兄弟,一个是后进先出,一个是先进先出。那么就让我们来详细的了解一下队列把。

目录

一.队列概念 

二.队列的实现 

1.定义队列

2.初始化队列

3.入队 

4.判断队列是否为空

5.出队 

6.返回队头和队尾 

7.查看队尾内容

8.查看队列数量 

9.销毁队列 

三.队列实现所有代码

四.结言


 

一.队列概念 

队列:

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

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

在数组内实现避免不了有数据的移动,比如将a0当队头插入队列时进行尾插,但是在每次出队的时候需要将后面的数据向前移动一位,这就不免是(n-1)的时间复杂度。

而将an做位队头那么每次插入时又需要挪动数据,时间复杂度也是(n-1),所以我们采用链表的方式实现就很方便。

二.队列的实现 

1.定义队列

typedef int QEtype;typedef struct QEnode{QEtype val;struct QEnode *next;
}QEnode;typedef struct QE
{QEnode* head;QEnode* tail;int size;
}QE;

这里我们把队列的队头,队尾以及队列的长度记录下来。这样会对我们进行的操作有很大的便利。

2.初始化队列

void QEInit(QE* qe)
{assert(qe);qe->head = NULL;qe->tail = NULL;qe->size = 0;
}

3.入队 

void QEPush(QE* qe, QEtype x)
{assert(qe);QEnode* newnext = (QEnode*)malloc(sizeof(QEnode));if (newnext == NULL){perror(malloc);return;}newnext->next = NULL;newnext->val = x;if (qe->size == 0){qe->head = qe->tail = newnext;}else{qe->tail->next = newnext;qe->tail = newnext;}qe->size++;
}

我们入队列选用的是尾插。

4.判断队列是否为空

_Bool QEempty(QE* qe)
{assert(qe);return qe->size == 0;
}

5.出队 

void QEPop(QE* qe)
{assert(qe);assert(!QEempty(qe));if (qe->size == 1){free(qe->head);qe->head = NULL;qe->tail = NULL;}else{QEnode* prev = qe->head->next;free(qe->head);qe->head = prev;}qe->size--;
}

对于出队我们选用头删。

6.返回队头和队尾 

QEnode* QETop(QE* qe)
{assert(qe);assert(!QEempty(qe));return qe->head;
}
QEnode* QEDown(QE* qe)
{assert(qe);assert(!QEempty(qe));return qe->tail;
}

这就是我们当时表示出来队头和队尾的方便之处。

7.查看队尾内容

QEtype ShowDown(QE* qe)
{assert(qe);assert(!QEempty(qe));return qe->tail->val;
}

8.查看队列数量 

int QESize(QE* qe)
{assert(qe);assert(!QEempty(qe));return qe->size;
}

9.销毁队列 

void QEDestory(QE* qe)
{assert(qe);qe->head = qe->tail = NULL;qe->size = 0;free(qe->head);free(qe->tail);}

三.队列实现所有代码

QE.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QEtype;typedef struct QEnode{QEtype val;struct QEnode *next;
}QEnode;typedef struct QE
{QEnode* head;QEnode* tail;int size;
}QE;void QEInit(QE* qe);
void QEPush(QE* qe, QEtype x);
void QEPop(QE* qe);
_Bool QEempty(QE* qe);
QEnode* QETop(QE* qe);
QEnode* QEDown(QE* qe);
QEtype ShowDown(QE* qe);
int QESize(QE* qe);
void QEDestory(QE* qe);QE.c
void QEInit(QE* qe)
{assert(qe);qe->head = NULL;qe->tail = NULL;qe->size = 0;
}
void QEPush(QE* qe, QEtype x)
{assert(qe);QEnode* newnext = (QEnode*)malloc(sizeof(QEnode));if (newnext == NULL){perror(malloc);return;}newnext->next = NULL;newnext->val = x;if (qe->size == 0){qe->head = qe->tail = newnext;}else{qe->tail->next = newnext;qe->tail = newnext;}qe->size++;
}
_Bool QEempty(QE* qe)
{assert(qe);return qe->size == 0;
}
void QEPop(QE* qe)
{assert(qe);assert(!QEempty(qe));if (qe->size == 1){free(qe->head);qe->head = NULL;qe->tail = NULL;}else{QEnode* prev = qe->head->next;free(qe->head);qe->head = prev;}qe->size--;
}
QEnode* QETop(QE* qe)
{assert(qe);assert(!QEempty(qe));return qe->head;
}
QEnode* QEDown(QE* qe)
{assert(qe);assert(!QEempty(qe));return qe->tail;
}
QEtype ShowDown(QE* qe)
{assert(qe);assert(!QEempty(qe));return qe->tail->val;
}
int QESize(QE* qe)
{assert(qe);assert(!QEempty(qe));return qe->size;
}
void QEDestory(QE* qe)
{assert(qe);qe->head = qe->tail = NULL;qe->size = 0;free(qe->head);free(qe->tail);}test.c#include"QE.h"void test()
{QE qe = {0};QEInit(&qe);QEPush(&qe, 1);QEPush(&qe, 2);QEPush(&qe, 3);QEPush(&qe, 4);printf("队列数量%d\n", QESize(&qe));while (!QEempty(&qe)){QEnode* ret = QETop(&qe);printf("%d ", ret->val);QEPop(&qe);}printf("\n队列数量%d", QESize(&qe));}
int main()
{test();return 0;
}

四.结言

好了我么队列和栈就以及全部说完了,感谢大家的关注。

有喜欢的兄弟们可以一键三连!!

谢谢大家了,拜拜。

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

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

相关文章

使用kali进行DDos攻击

使用kali进行DDos攻击 1、打开命令提示符&#xff0c;下载DDos-Attack python脚本 git clone https://github.com/Elsa-zlt/DDos-Attack 2、下载好之后&#xff0c;cd到DDos-Attack文件夹下 cd DDos-Attack 3、修改&#xff08;设置&#xff09;对ddos-attack.py文件执行的权…

Git 核心概念与实操

这里写目录标题 1 版本回退2 工作区、暂存区、本地仓库、远程仓库 1 版本回退 原文链接&#xff1a;https://www.liaoxuefeng.com/wiki/896043488029600/897013573512192 首先 git log 查看提交记录 在Git中&#xff0c;用 HEAD 表示当前版本 上一个版本就是 HEAD^ &#xff…

IDM 平替 Gopeed Flutter 开源免费下载工具

IDM 平替 Gopeed Flutter 开源免费下载工具 视频 https://youtu.be/m206G5lVXPM https://www.bilibili.com/video/BV1Lz421k7Zp/ 前言 原文 https://ducafecat.com/blog/flutter-gopeed-downloader-idm-replace https://flutter.ducafecat.com/github/repo/GopeedLab/gopeed…

总结Java中的synchronized

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 目录 总结*synchronized**初识synchronized*使用synchronizedsynchronized的特性(1)可重入性(2)自适应过程(3)锁消除(4)非公平锁(5)互斥锁 总结synchronized 初识synchronized 通过一个线程不安…

TCP/IP常用协议栈图解

1.引言 最近看了一些计算机网络的课程&#xff0c;总结借鉴了一些TCP/IP常用协议&#xff0c;罗列在以下图中&#xff0c;以便有一个整体观。 2.图解 先上图 3.总结 TCP/IP协议是实际用的计算机网络通信的标准协议栈&#xff0c;自上而下分为应用层&#xff0c;传输层&#xf…

4.23日总结(项目总结)

1.项目&#xff1a; 今日项目通过一个在登录界面的一个静态变量&#xff0c;完成了区分老师和学生&#xff0c;能够分开老师和学生&#xff0c;并且不同身份的人进去会有不同的显示&#xff0c;以及登录链接主界面&#xff0c;还有学生和老师的不同的表&#xff0c;其次就是创…

陆金所控股一季报到底是利好还是利空?

3月底&#xff0c;陆金所控股&#xff08;LU.N;06623.HK&#xff09;因其特别分红方案受到市场高度关注。但在4月23日发布的2024年一季度财报中&#xff0c;陆金所控股营收同比下降30.9%&#xff0c;净亏损8.3亿元。 两者对比&#xff0c;外界不由得对公司的经营状况产生疑惑。…

机器人模型匹配控制(MPC)MATLAB实现

模型匹配控制&#xff08;Model matching control&#xff09;是指设计一个控制器使闭环系统的传递函数tf(s)与td(s)相一致&#xff01; mpcDesigner 可以分为&#xff1a; 2时域精确模型匹配控制3频域精确模型匹配控制 机械臂控制中应用模型匹配控制&#xff08;Model Matc…

Rabbitmq安装延迟插件rabbitmq_delayed_message_exchange失败

Docker里的Rabbitmq容器安装延迟插件rabbitmq_delayed_message_exchange失败 一启动插件Rabbitmq容器直接停止运行了 rabbitmq-plugins enable rabbitmq_delayed_message_exchange排除了版本问题和端口问题等&#xff0c;发现是虚拟机运行内存不够&#xff0c;增加虚拟机运行内…

WEB前端-笔记(三)

目录 一、事件 1.1类型 1.2对象 1.3页面加载事件 1.4滚动事件 1.5尺寸事件 1.6捕获&冒泡事件 1.7阻止表单提交 1.8全选案例 1.9事件委托 ​编辑 1.10client&offset 1.11换取元素的位置 1.12创建节点 1.13克隆节点 1.14删除节点 1.15setTimeout 1.16s…

【Hadoop】-Hive部署[12]

目录 思考 VMware虚拟机部署 规划 步骤1&#xff1a;安装MySQL数据库 步骤2&#xff1a;配置Hadoop 步骤3&#xff1a;下载解压Hive 步骤4&#xff1a;提供MySQL Driver包 步骤5&#xff1a;配置Hive 步骤6&#xff1a;初始化元数据库 步骤7&#xff1a;启动Hive&…

Docker搭建代码托管Gitlab

文章目录 一、简介二、Docker部署三、管理员使用四、用户使用五、用户客户端 一、简介 GitLab是一个基于Git的代码托管和协作平台&#xff0c;类似于GitHub。 它提供了一个完整的工具集&#xff0c;包括代码仓库管理、问题跟踪、CI/CD集成、代码审查等功能。 GitLab的开源版本…

全面了解俄罗斯的VK开户和Yandex投放及内容运营

俄罗斯的VKontakte&#xff08;简称VK&#xff09;和Yandex是两个重要的在线平台&#xff0c;对于希望在俄罗斯市场进行推广的企业来说&#xff0c;了解如何在这些平台上开户和投放广告以及内容运营是非常关键的。 俄罗斯vk广告如何开户&#xff1f; 通过上海上弦进行俄罗斯V…

画图的神器及必备的调色和选图工具

大学生研究生论文写作及画图的神器 前言常用的工具集合画图工具配色参考画图神器词云 最后下篇 前言 好久没有更博&#xff0c;来更一下吧。最近刚好被问到平常是用什么来画图的&#xff0c;包括会议论文&#xff0c;各种类型的PPT汇报以及项目报告等等里面的图怎么画好。所以…

7.2K star!一个完全免费,可以本地部署的 AI 搜索聚合器。新手可尝试

原文链接&#xff1a;7.2K star&#xff01;一个完全免费&#xff0c;可以本地部署的 AI 搜索聚合器。新手可尝试 ChatGPT 刚上线的时候我用的很少&#xff0c;还是习惯用 Google。主要还是因为不信任&#xff0c;怕它对我胡说八道。 慢慢的&#xff0c;也没有一个明确的时间…

SpringCloud 与 Dubbo 的区别详解

一、Spring Cloud 和 Dubbo 的概述 1.1 SpringCloud 简介 SpringCloud 是一个用于构建云原生应用的框架集合&#xff0c;它为开发者提供了一套完整的工具链&#xff0c;用于快速搭建分布式系统。SpringCloud 基于 SpringBoot 开发&#xff0c;具有如下特点&#xff1a; 提供…

美国签证证件照规格要求(51mm*51mm)

美国签证证件照规格要求&#xff08;51mm*51mm&#xff09;

Docusaurus 3.2 发布,更快的 MDX 开发体验

Docusaurus 是一个静态站点生成器。它构建了一个具有快速客户端导航的单页面应用程序&#xff0c;利用 React 的全部功能使你的网站具有交互性。它提供开箱即用的文档功能&#xff0c;但可用于创建任何类型的网站&#xff08;个人网站、产品、博客、营销登陆页面等&#xff09;…

(三)Servlet教程——Tomcat安装与启动

首先打开浏览器在浏览器地址栏中输入清华大学开源软件镜像站地址&#xff0c;地址如下 https://mirrors.tuna.tsinghua.edu.cn/ 输入地址后回车会出现如下图所示的界面 在该界面找tomcat不是很好找&#xff0c;在搜索框中输入apache然后回车&#xff0c;输入apache后并回车后出…

数控6面钻的优缺点

在木工、家具制造和建筑行业中&#xff0c;数控6面钻已成为一种革命性的工具。这种先进的机器以其高效、精准和多功能性受到了广大制造商的青睐。然而&#xff0c;就像任何技术产品一样&#xff0c;数控6面钻也有其优缺点。在本文中&#xff0c;我们将深入探讨数控6面钻的优缺点…