数据结构-队列(C语言的简单实现)

简介

  • 队列也是一种数据结构,队列也可以用来存放数字
  • 每次只能向队列里将入一个数字,每次只能从队列里获得一个数字
  • 在队列中,允许插入的一段称为入队口,允许删除的一段称为出队口
  • 它的原则是先进先出(FIFO: first in first out),先进入队列的数据先出去,后进入的后出去。
  • 队列的插入操作称为入队
  • 队列的删除操作称为出队

以下是队列中进行入队和出队的演示操作,数据1先进,也是数据1先出

在这里插入图片描述

代码实现

  1. 初始化队列
typedef struct queue{int* elements;  // 存储区int cap;  // 队列的容量int rear;  // 入队口int front;  // 出队口int size;  // 队列当前大小
}queue_t;
  1. 初始化队列
void queue_init(queue_t* pqueue, int cap){// 分配存储区空间pqueue->elements = malloc(sizeof(int) * cap);if(pqueue->elements == NULL){printf("内存分配失败\n");return;}// 赋值容量pqueue->cap = cap;// 此时因为没有收数据,出队口和入队口都是0,队列当前大小也是0pqueue->rear = 0;pqueue->front = 0;pqueue->size = 0;
}
  1. 销毁队列
void queue_deinit(queue_t* pqueue){free(pqueue->elements);pqueue->elements = NULL;pqueue->cap = 0;pqueue->rear = 0;pqueue->front = 0;pqueue->size = 0;
}
  1. 判断队列是否已满
int queue_full(queue_t* pqueue){// 当size==cap的时候,说明已满,反之则没满return pqueue->size == pqueue->cap;
}
  1. 判断队列是否为空
int queue_empty(queue_t* pqueue){// 当size==0的时候,说明为空,反之则不为空return pqueue->size == 0;
}

以下是一组入队出队的操作

在这里插入图片描述

  1. 入队
void queue_push(queue_t* pqueue, int data){// 参考上面的视频,当此时还存在入队操作时,说明队列还没满,// 但是此时rear已经超过索引值了(也就是与cap值相等),需要将rear重置为0;if(pqueue->rear == pqueue=>cap)pqueue->rear = 0;pqueue->elements[pqueue->rear++] = data;pqueue->size++;
}
  1. 出队
int queue_pop(queue_t*  pqueue){// 与入队函数类似,当此时还存在出队操作时,说明队列不为空,// 但是此时front已经超过索引值了(也就是与cap值相等),需要将front重置为0if(pqueue->front == pqueue->cap)pqueue->front = 0;pqueue->size--;return pqueue->elements[pqueue->front++];
}

实例代码

创建三个文件: queue.cqueue.hmain.c,实现上面动图中的操作

  • queue.c定义队列具体的函数
#include "queue.h"// 初始化队列
void queue_init(queue_t* pqueue, int cap){pqueue->elements = malloc(sizeof(int) * cap);if(pqueue->elements == NULL){	printf("分配队列存储区失败!\n");return;}pqueue->cap = cap;pqueue->rear = 0;pqueue->front = 0;pqueue->size = 0;
}// 销毁队列
void queue_deinit(queue_t* pqueue){free(pqueue->elements);pqueue->elements = NULL;pqueue->cap = 0;pqueue->rear = 0;pqueue->front = 0;pqueue->size = 0;
}// 入队
void queue_push(queue_t* pqueue, int data){if(pqueue->rear == pqueue->cap)pqueue->rear = 0;pqueue->elements[pqueue->rear++] = data;pqueue->size++;
}// 出队
int queue_pop(queue_t* pqueue){if(pqueue->front == pqueue->cap)pqueue->front = 0;pqueue->size--;return pqueue->elements[pqueue->front++];
}//判断队列是否已满
int queue_full(queue_t* pqueue){return pqueue->size == pqueue->cap;
}// 判断队列是否为空
int queue_empty(queue_t* pqueue){return pqueue->size == 0;
}
  • queue.h声明队列的相关函数和定义队列
#ifndef __QUEUE_H
#define __QUEUE_H#include <stdio.h>
#include <stdlib.h>// 定义队列
typedef struct queue{int* elements;int cap;int rear;int front;int size;}queue_t;extern void queue_init(queue_t* pqueue, int cap);
extern void queue_deinit(queue_t* pqueue);
extern void queue_push(queue_t* pqueue, int data);
extern int queue_pop(queue_t* pqueue);
extern int queue_full(queue_t* pqueue);
extern int queue_empty(queue_t* pqueue);#endif
  • main.c主函数使用队列
#include "queue.h"int main(void){// 1. 创建一个队列queue_t queue;// 2. 初始化队列queue_init(&queue, 4);// 3. 入队4个数据printf("开始第一次入队(4个数据): ");int data = 10;for(int i = 0; i < 4; i++){if(!queue_full(&queue)){printf("%d ", data);queue_push(&queue, data);data += 10;}}printf("\n此时还剩%d个数据\n\n", queue.size);// 4. 出队2个数据printf("开始第一次出队(2个数据): ");for(int i = 0; i < 2; i++){if(!queue_empty(&queue)){data = queue_pop(&queue);printf("%d ", data);}}printf("\n此时还剩%d个数据\n\n", queue.size);// 5. 入队2个数据printf("开始第二次入队(2个数据): ");data = 10;for(int i = 0; i < 2; i++){if(!queue_full(&queue)){printf("%d ", data);queue_push(&queue, data);data += 10;}}printf("\n此时还剩%d个数据\n\n", queue.size);// 6. 将所有数据全部取出printf("将全部数据取出: ");while(!queue_empty(&queue)){data = queue_pop(&queue);printf("%d ", data);}printf("\n此时还剩%d个数据\n\n", queue.size);// 销毁队列queue_deinit(&queue);return 0;
}

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

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

相关文章

Docker之jenkins部署harbor在harbor中完成部署

Docker之jenkins部署harbor在harbor中完成部署 1、harbor作用 Harbor允许用户用命令行工具对容器镜像及其他Artifact进行推送和拉取&#xff0c;并提供了图形管理界面帮助用户查阅和删除这些Artifact。在Harbor 2.0版本中&#xff0c;除容器镜像外&#xff0c;Harbor对符合OCI…

商品推荐系统浅析 | 京东云技术团队

一、综述 本文主要做推荐系统浅析&#xff0c;主要介绍推荐系统的定义&#xff0c;推荐系统的基础框架&#xff0c;简单介绍设计推荐的相关方法以及架构。适用于部分对推荐系统感兴趣的同学以及有相关基础的同学&#xff0c;本人水平有限&#xff0c;欢迎大家指正。 二、商品…

【ChatGPT 指令大全】怎么使用ChatGPT辅助程式开发

目录 写程式 解读程式码 重构程式码 解 bug 写测试 写 Regex 总结 在当今快节奏的数字化世界中&#xff0c;程式开发变得越来越重要和普遍。无论是开发应用程序、网站还是其他软件&#xff0c;程式开发的需求都在不断增长。然而&#xff0c;有时候我们可能会遇到各种问题…

直播课 | 大橡科技研发总监丁端尘博士“类器官芯片技术在新药研发中的应用”

从类器官到类器官芯片&#xff0c;正在生物科学领域大放异彩。 药物研发需要新方法 众所周知&#xff0c;一款新药是一个风险大、周期长、成本高的艰难历程&#xff0c;国际上有一个传统的“双十”说法——10年时间&#xff0c;10亿美金&#xff0c;才可能成功研发出一款新药…

SpringCloud实用篇4——MQ RabbitMQ SpringAMQP

目录 1 初识MQ1.1 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.2 技术对比 2.快速入门2.1 安装RabbitMQ2.1.1 单机部署2.1.2集群部署 2.2 RabbitMQ消息模型2.3.导入Demo工程2.4 入门案例2.4.1 publisher实现2.4.2 consumer实现 3 SpringAMQP3.1 Basic Queue 简单队列模型3.1…

玩一玩通义千问Qwen开源版,Win11 RTX3060本地安装记录!

大概在两天前&#xff0c;阿里做了一件大事儿。 就是开源了一个低配版的通义千问模型--通义千问-7B-Chat。 这应该是国内第一个大厂开源的大语言模型吧。 虽然是低配版&#xff0c;但是在各类测试里面都非常能打。 官方介绍&#xff1a; Qwen-7B是基于Transformer的大语言模…

Java EE 突击 9 - Spring Boot 日志文件

Spring Boot 日志文件 学习目标一 . 日志有什么用1.1 日志格式说明 二 . 自定义日志打印2.1 得到日志对象2.2 使用日志对象提供的方法 , 输出自定义的日志内容2.3 日志的级别 三 . 日志持久化3.1 在配置文件里面设置日志名称3.2 设置日志的保存目录 四 . 日志级别的设置五 . 简…

flutter 手写日历组件

先看效果 直接上代码 calendar_popup_view.dart import package:flutter/material.dart; import package:intl/intl.dart;import custom_calendar.dart; import hotel_app_theme.dart;class CalendarPopupView extends StatefulWidget {const CalendarPopupView({required th…

【【萌新的STM32 学习-6】】

萌新的STM32 学习-6 BSP 文件夹&#xff0c;用于存放正点原子提供的板级支持包驱动代码&#xff0c;如&#xff1a;LED、蜂鸣器、按键等。 本章我们暂时用不到该文件夹&#xff0c;不过可以先建好备用。 CMSIS 文件夹&#xff0c;用于存放 CMSIS 底层代码&#xff08;ARM 和 ST…

深度学习之用PyTorch实现逻辑回归

0.1 学习视频源于&#xff1a;b站&#xff1a;刘二大人《PyTorch深度学习实践》 0.2 本章内容为自主学习总结内容&#xff0c;若有错误欢迎指正&#xff01; 代码&#xff08;类比线性回归&#xff09;&#xff1a; # 调用库 import torch import torch.nn.functional as F#…

HDFS小文件解决方案---archive归档文件命令

小文件解决方案 背景Archive概述创建archive查看归档文件查看归档之后的样子查看归档文件之前的样子 提取archivearchive注意事项 背景 hdfs并不擅长存储小文件&#xff0c;因为每个文件最少一个block&#xff0c;每个block的元数据都会在namenode占用内存&#xff0c;如果存在…

Linux驱动之设备树添加蜂鸣器驱动

目录 一、蜂鸣器简介 二、硬件原理分析 三、蜂鸣器驱动原理 四、开发环境 五、修改设备树文件 1、添加 pinctrl 节点 2、添加 BEEP 设备节点 3、检查 PIN 是否被其他外设使用 六、蜂鸣器驱动程序编写 七、测试程序编写 八、运行验证 在 I.MX6U-ALPHA 开发板上有一个有源…

一种水文水利行业满管非满管双声道流量计安装调试

供电电源 用户应该特别注意&#xff1a;若是交流&#xff08;AC220V&#xff09;供电的主机插入直流电源&#xff0c;或者直流&#xff08;DC24V&#xff09;供电的主机接入AC220V电源&#xff0c;就会把流量计烧毁。 普通主机&#xff08;包括固定式主机、盘装式主机&#x…

前沿分享-无创检测血糖RF波

非侵入性血糖仪&#xff0c;利用射频 (RF) 波连续测量血液中的葡萄糖水平。利用射频波技术连续实时监测血液中的葡萄糖水平&#xff0c;使用的辐射要比手机少得多。 大概原理是血液中的葡萄糖是具有介电特性&#xff0c;一般来说就是介电常数。 电磁波波幅的衰减反映了介质对电…

火车头采集器AI伪原创【php源码】

大家好&#xff0c;本文将围绕python作业提交什么文件展开说明&#xff0c;python123怎么提交作业是一个很多人都想弄明白的事情&#xff0c;想搞清楚python期末作业程序需要先了解以下几个事情。 火车头采集ai伪原创插件截图&#xff1a; I have a python project, whose fold…

FFmpeg常见命令行(二):FFmpeg转封装

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;如何使…

C# 2048小游戏核心算法

文章目录 01.程序结构划分02.去零03.合并04.上移05.下移/左移/右移&#xff0c;只是取数据的方向不同06.提高可读性 01.程序结构划分 02.去零 有序向量“唯一化”的思路。 /// <summary>/// 去零/// </summary>/// <param name"row">对于一行或一…

Clash 意外退出后 chrome / google 谷歌 浏览器无法连接互联网

解决方案&#xff1a; 以管理员模式打开命令行&#xff0c;输入&#xff1a;netsh winsock reset &#xff0c;然后重启电脑 如果还不行的话&#xff0c; 在 chromevs中选中 设置>隐私和安全>安全>使用安全 dns> 使用您当前的服务提供商 即可

数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)

目录 开放地址法&#xff08;Open Addressing&#xff09; 线性探测&#xff08;Linear Probing&#xff09; 散列表查找性能分析 平方探测&#xff08;Quadratic Probing&#xff09; 定理 平方探测法的查找与插入 双散列探测法&#xff08;Double Hashing&#xff09…

分布式 - 消息队列Kafka:Kafka生产者发送消息的3种方式

文章目录 1. Kafka 生产者2. kafaka 命令行操作3. Kafka 生产者发送消息流程4. Kafka 生产者发送消息的3种方式1. 发送即忘记2. 同步发送3. 异步发送 5. Kafka 消息对象 ProducerRecord 1. Kafka 生产者 Kafka 生产者是指使用 Apache Kafka 消息系统的应用程序&#xff0c;它们…