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,一经查实,立即删除!

相关文章

【免费题库】华为OD机试 - 会议室占用时间(Java JS Python C C++)

须知 哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 文章目录 须知题目描述输入描述输出描述解题思路:题目描述 现有若干个会议,所有会议共享一个会议室,用数组表示各个会议的开始时间和结束时间,格式为: [[会议1开始时间, 会议…

使用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…

让多个域名都可以访问一个wordpress网站

WordPress在安装后会默认绑定当前的域名&#xff0c;如果把多个域名都绑定到wordpress网站后&#xff0c;在通过这些域名访问时&#xff0c;还是会跳转到安装时候的域名。 有没有什么办法可以&#xff0c;让各自域名&#xff0c;访问这个wordpress网站&#xff0c;都显示的是当…

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…

Android ANR 日志导出及分析

导出 ANR 日志 cmd 下 adb shell 进入 adb 交互&#xff0c;cd data/anr 进入 anr 日志文件夹&#xff0c;输入 ls 查看 anr 日志文件列表&#xff1a;exit 退出交互 C:\Users\YourNamePath>adb shell YourDeviceName:/ $ cd data/anr YourDeviceName:/data/anr $ ls anr_…

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…

DH 算法;加密算法--基于数学困难问题

目录 DH 算法 加密算法--基于数学困难问题--离散对数问题--可逆困难运算

【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…

XiaodiSec day024 Learn Note 小迪安全学习笔记

XiaodiSec day024 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day24 sql injection 知识点 脚本代码与数据库前置只是 access 数据库注入 mysql 数据库注入 前置知识 开始 数据库类型不同&#xff0c;流程会不同 access 和 asp 目前使用量较少&a…

mysql索引失效的原因以及解决办法

索引失效的原因 条件表达式中使用了函数条件表达式使用了"不等于"操作符列类型不匹配使用LIKE操作符进行模糊匹配数据量过小 解决办法 避免在索引列上使用函数 使用合适的条件表达式 确保查询条件与索引列类型匹配 使用合适的索引 表结构优化 使用索引提示

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

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