数据结构学习系列之循环队列

  • 队列的基本概念:
  • 队列(Queue):一种先进先出(FIFO)的线性表;
  • 队尾(rear):允许插入的一端;
  • 队头(front):允许删除的一端;
  • 入队列:队列的插入元素的操作;
  • 出队列:队列的删除元素的操作;
  • 循环队列:
  • 即:队列的头尾相接顺序存储结构
  • 入队列:rear = (rear + 1) % Queue_size
  • 出队列:front = (front + 1) % Queue_size
  • 队空:rear == front
  • 队满:(rear + 1) % Queue_size == front
  • 队列的长度:(rear - front + Queue_size) % Queue_size
  • 入队列:
int push_loop_queue(queue_t *loop_queue,int data)
{if(NULL == loop_queue){printf("入参合理性检查\n");return -1;}if(queue_is_full(loop_queue)){printf("此时队列已满,入队失败\n");return -1;}loop_queue->a[loop_queue->rear] = data;loop_queue->rear = (loop_queue->rear + 1) % N;return 0;}
  • 出队列:
int pop_loop_queue(queue_t *loop_queue,int *data)
{if(NULL == loop_queue || NULL == data){printf("入参合理性检查\n");return -1;}if(queue_is_empty(loop_queue)){printf("此时队列为空,出队失败\n");return -1;}*data = loop_queue->a[loop_queue->front];loop_queue->front = (loop_queue->front + 1) % N;return 0;}
  • 示例代码:
  • loop_queue.h:
#ifndef __LOOP_QUEUE_H__
#define __LOOP_QUEUE_H__#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define N 6typedef struct Loop_Queue{int a[N];int front;int rear;}queue_t;int create_loop_queue(queue_t **p);
int queue_is_full(queue_t *loop_queue);
int push_loop_queue(queue_t *loop_queue,int data);
int queue_is_empty(queue_t *loop_queue);
int pop_loop_queue(queue_t *loop_queue,int *data);
int clean_loop_queue(queue_t *loop_queue);
int destroy_loop_queue(queue_t **loop_queue);
int print_loop_queue(queue_t *loop_queue);#endif
  • loop_queue.c:
#include "loop_queue.h"//创建队列
int create_loop_queue(queue_t **p)
{if(NULL == p){printf("入参合理性检查\n");return -1;}*p = (queue_t *)malloc(sizeof(queue_t));if(NULL == *p){printf("内存分配失败\n");return -1;}memset(*p,0,sizeof(queue_t));return 0;}//判断队列是否为满
int queue_is_full(queue_t *loop_queue)
{if(NULL == loop_queue){printf("入参合理性检查\n");return -1;}return (loop_queue->rear + 1) % N == loop_queue->front ? 1 : 0;}//入队列
int push_loop_queue(queue_t *loop_queue,int data)
{if(NULL == loop_queue){printf("入参合理性检查\n");return -1;}if(queue_is_full(loop_queue)){printf("此时队列已满,入队失败\n");return -1;}loop_queue->a[loop_queue->rear] = data;loop_queue->rear = (loop_queue->rear + 1) % N;return 0;}//判断队列是否为空
int queue_is_empty(queue_t *loop_queue)
{if(NULL == loop_queue){printf("入参合理性检查\n");return -1;}return loop_queue->rear == loop_queue->front ? 1 : 0;}//出队列
int pop_loop_queue(queue_t *loop_queue,int *data)
{if(NULL == loop_queue || NULL == data){printf("入参合理性检查\n");return -1;}if(queue_is_empty(loop_queue)){printf("此时队列为空,出队失败\n");return -1;}*data = loop_queue->a[loop_queue->front];loop_queue->front = (loop_queue->front + 1) % N;return 0;}//清空队列
int clean_loop_queue(queue_t *loop_queue)
{if(NULL == loop_queue){printf("入参合理性检查\n");return -1;}loop_queue->front = 0;loop_queue->rear = 0;return 0;}//销毁队列
int destroy_loop_queue(queue_t **loop_queue)
{if(NULL == loop_queue){printf("入参合理性检查\n");return -1;}free(*loop_queue);*loop_queue = NULL;return 0;}//遍历队列的元素
int print_loop_queue(queue_t *loop_queue)
{if(NULL == loop_queue){printf("入参合理性检查\n");return -1;}int i = loop_queue->front;while(i != loop_queue->rear){printf("%d ",loop_queue->a[i]);i = (i + 1) % N;}puts("");return 0;}
  • main.c:
#include "loop_queue.h"int main(int argc, char const *argv[])
{queue_t *loop_queue = NULL;create_loop_queue(&loop_queue);printf("loop_queue = %p\n",loop_queue);//入队push_loop_queue(loop_queue,11);push_loop_queue(loop_queue,33);push_loop_queue(loop_queue,11);push_loop_queue(loop_queue,66);push_loop_queue(loop_queue,11);push_loop_queue(loop_queue,99);print_loop_queue(loop_queue);//出队int data;pop_loop_queue(loop_queue,&data);printf("%d ", data);pop_loop_queue(loop_queue,&data);printf("%d ", data);pop_loop_queue(loop_queue,&data);printf("%d ", data);pop_loop_queue(loop_queue,&data);printf("%d ", data);pop_loop_queue(loop_queue,&data);printf("%d ", data);puts("");pop_loop_queue(loop_queue,&data);clean_loop_queue(loop_queue);print_loop_queue(loop_queue);destroy_loop_queue(&loop_queue);printf("loop_queue = %p\n",loop_queue);return 0;
}
  • 运行结果:
loop_queue = 0x562e9a67b260
此时队列已满,入队失败
11 33 11 66 11 
11 33 11 66 11 
此时队列为空,出队失败loop_queue = (nil)
  • 注意:
  • 本示例代码的存储空间预设可以存储6个元素,但是实际上只能存储5个元素;
  • 虽然浪费了1个存储空间,却给判断队列是否为满提供了便利
  • 本示例代码,仅供参考;

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

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

相关文章

基于微信小程的流浪动物领养小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

IDEA 使用

目录 Git.gitignore 不上传取消idea自动 add file to git本地已经有一个开发完成的项目&#xff0c;这个时候想要上传到仓库中 Git .gitignore 不上传 在项目根目录下创建 .gitignore 文件夹&#xff0c;并添加内容&#xff1a; .gitignore取消idea自动 add file to git 在…

Java中将字符串ArrayList转换为数组的四种方法

Java中将String的ArrayList转换为String数组&#xff1a; 如果运行&#xff1a; String[] result (String[]) INPUT_LIST.toArray(); 得到错误&#xff1a; java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; 抛出了Cl…

layuiselect设置为不可下拉选取

$("#exam").siblings(".layui-form-select").find("dl").remove(); 或 layuiSelectDisable($("#exam")); // 设置selet元素不可下拉选择function layuiSelectDisable(selectElem) {try {var dlElem selectElem.siblings(".layu…

9.30作业

C语言基础考题&#xff08;40&#xff09; 选择题 20分每题2分 1、已知字母A的ASCII码为十进制数值65&#xff0c;且S为字符型&#xff0c;则执行语句SA6-3&#xff1b;后S中的值为 ( ) A.D B.68 C.不确定的值 D.C 2、若有定义语句&#xff1a;int a12;&#xff0c;则执…

后端大厂面试-15道题

1. 说说计算机存储结构 计算机存储结构通常包括这几个层次&#xff1a; 主存储器&#xff08;Main Memory&#xff09;&#xff1a;也称为内存&#xff08;RAM&#xff0c;Random Access Memory&#xff09;&#xff0c;主要用于存储当前正在执行的程序和数据。它是计算机中最…

通俗讲解深度学习轻量网络MobileNet-v1/v2/v3

MobileNet网络是由google团队在2017年提出的&#xff0c;专注于移动端或者嵌入式设备中的轻量级CNN网络。相比传统卷积神经网络&#xff0c;在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%&#xff0c;但模型参数只有VGG的1/32)。MobileNet网络…

时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测

时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序…

Spring Boot 技术架构图(InsCode AI 创作助手辅助)

Spring Boot 技术架构是一种用于构建现代应用程序的框架&#xff0c;它可以与各种前端、代理、网关、业务服务、中间件、存储、持续集成和容器服务集成在一起&#xff0c;以创建功能强大的应用程序。 源文件下载链接&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

CMD命令终端快捷键学习

很多环境需要安装并且指定环境变量才可用终端访问 比如一些数据库、一些环境、例如&#xff1a;nodejs Oracle、mysql 在一个文件夹按住shift鼠标右键可以快速在当前目录运行终端&#xff01;免去cd 目录的烦恼 快捷键 当你学习和使用命令终端&#xff08;如 Windows 的 CMD&…

opencv图像数组坐标系

在OpenCV的Python接口&#xff08;cv2&#xff09;中&#xff0c;加载的图像数组遵循以下坐标系和方向约定&#xff1a; 1. **坐标系&#xff1a;** OpenCV的坐标系遵循数学中的坐标系&#xff0c;原点&#xff08;0, 0&#xff09;位于图像的左上角。横轴&#xff08;X轴&…

Java基础---第七篇

系列文章目录 文章目录 系列文章目录一、final有哪些用法?二、static都有哪些用法?三、3*0.1 == 0.3返回值是什么一、final有哪些用法? final也是很多面试喜欢问的地方,但我觉得这个问题很无聊,通常能回答下以下5点就不错了: 被final修饰的类不可以被继承 被final修饰的方法…

力扣第459题 重复的子字符串 巧用erase find c++注释版

题目 459. 重复的子字符串 简单 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "aba" 输出: false示例 3: …

抖音开放平台第三方代小程序开发,一整套流程

大家好&#xff0c;我是小悟 抖音小程序第三方平台开发着力于解决抖音生态体系内的小程序管理问题&#xff0c;一套模板&#xff0c;随处部署。能尽可能地减少服务商的开发成本&#xff0c;服务商只用开发一套小程序代码作为模板就可以快速批量的孵化出大量的商家小程序。 第…

EGL函数翻译--eglBindAPI

EGL函数翻译–eglBindAPI 函数名 EGLBoolean eglBindAPI(EGLenum api); 参数描述 api:枚举类型&#xff0c;设置当前使用的渲染API。可以使用以下值之一&#xff1a; EGL_OPENGL_API: OpenGL 的API EGL_OPENGL_ES_API: OpenGL ES的API EGL_OPENVG_API&#xff1a;OPenVG 的AP…

CentOS 7 安装 Docker 的详细步骤

文章目录 Docker简介1.更新2.安装必要的软件包3.添加Docker仓库4.安装5.安装后的一些常规设置及常用的命令5.1 启动 Docker5.2 Docker 在系统启动时自动运行5.3 运行一个 Hello World 镜像5.4 查看docker运行状态5.5 docker ps5.6 查看docker版本 6.安装种常见的错误错误1:yum-…

【CMU15-445 Part-14】Query Planning Optimization I

Part14-Query Planning & Optimization I SQL is Declarative&#xff0c;只告诉想要什么而不需要说怎么做。 IBM System R是第一个实现query optimizer查询优化器的系统 Heuristics / Rules 条件触发 静态规则&#xff0c;重写query来remove 低效或者愚蠢的东西&#xf…

Ubuntu性能分析-ftrace 底层驱动

1、框架介绍 ftrace内核驱动可以分为几部分:ftrace framework,RingBuffer,debugfs,Tracepoint,各种Tracer。 ftrace框架是整个ftrace功能的纽带,包括对内和的修改,Tracer的注册,RingBuffer的控制等等。 RingBuffer是静态动态ftrace的载体。 debugfs则提供了用户空间…

Java基础---第八篇

系列文章目录 文章目录 系列文章目录一、a=a+b与a+=b有什么区别吗?二、try catch finally,try里有return,finally还执行么?三、Excption与Error包结构一、a=a+b与a+=b有什么区别吗? += 操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果…

Python爬虫-requests.exceptions.SSLError: HTTPSConnectionPool疑难杂症解决(1)

前言 本文是该专栏的第7篇,后面会持续分享python爬虫案例干货,记得关注。 在爬虫项目开发中,偶尔可能会遇到SSL验证问题“requests.exceptions.SSLError: HTTPSConnectionPool(host=www.xxxxxx.com, port=443): Max retries exceeded with url ...”。亦或是验证之后的提示…