数据结构-队列(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.rhkb.cn/news/88430.html

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

相关文章

Titanic--细节记录二

目录 merge、join以及concat的方法的不同以及相同 merge join concat stack函数 agg函数 countplot--计算条形统计图 FacetGrid kdeplot--核密度估计图 facet.set facet.add_legend() 折线图表示年龄分布情况 为什么所有的曲线都被添加到同一个图上&#xff1a; 填充…

标记垃圾,有三种色彩:四千长文带你深入了解三色标记算法

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

MFC计算分贝

分贝的一种定义是&#xff0c;表示功率量之比的一种单位&#xff0c;等于功率强度之比的常用对数的10倍&#xff1b; 主要用于度量声音强度&#xff0c;常用dB表示&#xff1b; 其计算&#xff0c;摘录网上一段资料&#xff1b; 声音的分贝值可以通过以下公式计算&#xff1…

【数据结构】‘双向链表’冲冲冲

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Mybatis-Plus

1. Mybatis-Plus概念 1.1 Mybatis-Plus介绍 官⽹&#xff1a; https://mybatis.plus/ 或 https://mp.baomidou.com/ Mybatis-Plus 介绍 MyBatis-Plus &#xff08;简称 MP &#xff09;是⼀个 MyBatis 的增强⼯具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;…

“可一学院”区块链学习平台正式启动,助力BSV技术普及与传播

2023年8月8日&#xff0c;上海可一澈科技有限公司&#xff08;以下简称“可一科技”&#xff09; 正式发布区块链学习平台“可一学院”。“可一学院” 立足于BSV区块链技术本源&#xff0c;汇集了多层次的专业课程和学习资源&#xff0c;致力于打造一个适合各类人群使用的一站式…

SpringMVC关于SSM的整合配置步骤

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 SSM整合 一、创建工程1.1创建Maven工程1.2工程命名1.3检查…

Spring Boot 项目实现 Spring AOP

【注】实现在SpringBoot项目中&#xff0c;同时给两个类的方法添加AOP前置通知 1、创建一个SpringBoot项目 2、创建两个目标类和方法 package com.tqazy.learn_spring_project.spring_aop;import org.springframework.stereotype.Service;/*** ClassName SpringAopUserServi…

JZ40最小的K个数

题目地址&#xff1a;最小的K个数_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 注意本题不需要去重。 最简单的方法&#xff1a;排序后数组顺序是由小到大的&#xff0c;也就是说此时数组前k个数就是我们要求的结果。 整体代码&#xff1a; public ArrayLi…

【Linux从入门到精通】文件I/O操作(C语言vs系统调用)

文章目录 一、C语言的文件IO相关函数操作 1、1 fopen与fclose 1、2 fwrite 1、3 fprintf与fscanf 1、4 fgets与fputs 二、系统调用相关接口 2、1 open与close 2、2 write和read 三、简易模拟实现cat指令 四、总结 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍…

MySQL多表查询

1.创建student和score表 创建score表 2.为student表和score表增加记录 向student表插入记录的INSERT语句如下&#xff1a; 向score表插入记录的INSERT语句如下&#xff1a; 1.查询student表的所有记录 2.查询student表的第2条到4条记录 3.从student表查询所有学生的学号&#…

图·c++

数据结构&#xff1a; 邻接矩阵&#xff0c;邻接表 1.图的存储方式&#xff1a;邻接矩阵&#xff0c;邻接表 1.稀疏图和稠密图 2.无向图&#xff1a; n n n 个点&#xff0c;最多 n ( n − 1 ) / 2 n(n-1)/2 n(n−1)/2 条边&#xff0c; 当 m m m 接近 n ( n − 1 ) / 2 …

【JVM】CPU飙高排查方案与思路

文章目录 CPU飙高排查方案与思路 CPU飙高排查方案与思路 1.使用top命令查看占用cpu的情况 2.通过top命令查看后&#xff0c;可以查看是哪一个进程占用cpu较高&#xff0c;上图所示的进程为&#xff1a;40940 3.查看进程中的线程信息 4.可以根据进程 id 找到有问题的线程&a…

积木报表集成前端加载js文件404

项目场景&#xff1a; 在集成积木报表和shiro时候&#xff1a; 集成积木报表&#xff0c;shrio&#xff0c;shrio是定义在另一个模块下的&#xff0c;供另一个启动类使用&#xff0c;积木报表集成shrio的时候&#xff0c;需要依赖存放shrio的核心包&#xff0c;该核心包除了存…

React构建的JS优化思路

背景 之前个人博客搭建时&#xff0c;发现页面加载要5s才能完成并显示 问题 React生成的JS有1.4M&#xff0c;对于个人博客服务器的带宽来说&#xff0c;压力较大&#xff0c;因此耗费了5S的时间 优化思路 解决React生成的JS大小&#xff0c;因为我用的是react-router-dom…

到 2030 年API 攻击预计将激增近 1000%

导读云原生应用程序编程接口管理公司 Kong 联合外部经济学家的最新研究预计&#xff0c;截至 2030 年 API 攻击将激增 996%&#xff0c;意味着与 API 相关的网络威胁的频率和强度都显着升级。 这项研究由 Kong 分析师和布朗大学副教授 Christopher Whaley 博士合作进行&#x…

webpack 热更新的实现原理

webpack 的热更新⼜称热替换&#xff08;Hot Module Replacement&#xff09;&#xff0c;缩写为HMR。这个机制可以做到不⽤刷新浏览器⽽将新变更的模块替换掉旧的模块。 原理&#xff1a; ⾸先要知道 server 端和 client 端都做了处理⼯作&#xff1a; 在 webpack 的 watch…

docker案例复现

$uri导致的CRLF注入漏洞 前期准备dockerdocker compose 漏洞配置 前期准备 docker 要完成这样的测试&#xff0c;需要我们有一定的环境&#xff0c;也就是需要大家去安装docker 更新系统软件包&#xff1a; sudo yum update 安装 Docker 的依赖软件包&#xff1a; sudo yum …

Ubuntu 20.04(服务器版)安装 Anaconda

0、Anaconda介绍 Anaconda是一个开源的Python发行版本&#xff0c;包含了包括Python、Conda、科学计算库等180多个科学包及其依赖项。因此&#xff0c;安装了Anaconda就不用再单独安装CUDA、Python等。 CUDA&#xff0c;在进行深度学习的时候&#xff0c;需要用到GPU&#xf…

百度云盘发展历程与影响

摘要&#xff1a; 百度云盘作为中国领先的云存储与共享服务提供商&#xff0c;自其创立至今经历了多个阶段的发展与变革。本论文通过对百度云盘的历史回顾与分析&#xff0c;探讨了其在技术、商业模式、用户体验以及对社会的影响等方面的演变。同时&#xff0c;还分析了在竞争激…