【C数据结构】循环队列_CyclicQueue

news2024/12/23 7:03:11

目录

循环队列_CyclicQueue

【1】循环队列

【1.1】循环队列的各个接口

【1.2】循环队列初始化

【1.3】循环队列初销毁

【1.4】循环队列插入

【1.5】循环队列删除

【1.6】循环队列获取头位置数据

【1.7】循环队列获取尾位置数据

【1.8】循环队列判满

【1.9】循环队列判空


循环队列_CyclicQueue

【1】循环队列

        另外扩展了解一下,实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。

【1.1】循环队列的各个接口

    #pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>


// 栈数据结构定义 ///
#define CYCLIC_QUEUE_CAPACITY 100
typedef int CQDataType;
typedef struct CyclicQueue {
    CQDataType* _buffer;
    int _front;
    int _back;
    size_t _size;
    size_t _Capacity;
}CQ;

// 栈常用接口定义 ///
/* 循环队列:初始化 */
void CyclicQueueInit(CQ* cq);

/* 循环队列:销毁 */
void CyclicQueueDestroy(CQ* cq);

/* 循环队列:插入 */
void CyclicQueuePush(CQ* cq, CQDataType val);

/* 循环队列:删除 */
void CyclicQueuePop(CQ* cq);

/* 循环队列:获取头位置数据 */
CQDataType CyclicQueueFront(CQ* cq);

/* 循环队列:获取尾位置数据 */
CQDataType CyclicQueueFrontBack(CQ* cq);

/* 循环队列:判断空 */
bool CyclicQueueEmpty(CQ* cq);

/* 循环队列:判断满 */
bool CyclicQueueFull(CQ* cq);

/* 循环队列:获取最大容量 */
size_t CyclicQueueCapacity(CQ* cq);

/* 循环队列:获取当前有效数据个数 */
size_t CyclicQueueSize(CQ* cq);

【1.2】循环队列初始化

/* 循环队列:初始化 */
void CyclicQueueInit(CQ* cq) {
    // 断言
    assert(cq);

    // 提前开辟空间
    cq->_buffer = (CQDataType*)malloc(sizeof(CQDataType) * (CYCLIC_QUEUE_CAPACITY + 1));
    if (cq->_buffer == NULL) {
        perror("malloc fail!");
        exit(-1);
    }
    // 初始化
    memset(cq->_buffer, 0, sizeof(CQDataType) * (CYCLIC_QUEUE_CAPACITY + 1));
    cq->_front = cq->_back = 0;
    cq->_size = 0;
    cq->_capacity = CYCLIC_QUEUE_CAPACITY + 1;
}

【1.3】循环队列初销毁

/* 循环队列:销毁 */
void CyclicQueueDestroy(CQ* cq) {
    // 断言
    assert(cq);

    // 释放空间
    free(cq->_buffer); cq->_buffer = NULL;
    // 初始化
    cq->_front = cq->_back = 0;
    cq->_size = 0;
    cq->_capacity = 0;
}

【1.4】循环队列插入

        插入时注意:back的位置到达后边界,需要让他回到0位置。

/* 循环队列:插入 */
void CyclicQueuePush(CQ* cq, CQDataType val) {
    // 断言
    assert(cq);

    // 检查是否满
    if (CyclicQueueFull(cq)) {
        printf("Cyclic Queue Full!\n");
        return ;
    }
    // 插入数据
    cq->_buffer[cq->_back++] = val;
    // 如果back到达尾部,需要调整为0
    cq->_back %= cq->_capacity;
    cq->_size++;
}

【1.5】循环队列删除

删除时注意:front的位置到达后边界,需要让他回到0位置(与插入相同)。

/* 循环队列:删除 */
void CyclicQueuePop(CQ* cq) {
    // 断言
    assert(cq);
 // 检查空
    if (CyclicQueueEmpty(cq)) {
        printf("Cyclic Queue Empty!\n");
        return;
    }

    cq->_front++;
    // 如果front到达尾部,需要调整为0
    cq->_front %= cq->_capacity;
    cq->_size--;
}

【1.6】循环队列获取头位置数据

/* 循环队列:获取头位置数据 */
CQDataType CyclicQueueFront(CQ* cq) {
    // 断言
    assert(cq);
    // 检查空
    if (CyclicQueueEmpty(cq)) {
        printf("Cyclic Queue Empty!\n");
        return -1;
    }

    return cq->_buffer[cq->_front];
}

【1.7】循环队列获取尾位置数据

/* 循环队列:获取尾位置数据 */
CQDataType CyclicQueueFrontBack(CQ* cq) {
    // 断言
    assert(cq);
    // 检查空
    if (CyclicQueueEmpty(cq)) {
        printf("Cyclic Queue Empty!\n");
        return -1;
    }
    else
    {
        return cq->_buffer[(cq->_back - 1 + cq->_capacity) % cq->_capacity];
    }
}

【1.8】循环队列判满

/* 循环队列:判断满 */
bool CyclicQueueFull(CQ* cq) {
    // 断言
    assert(cq);

    return (cq->_back + 1) % cq->_Capacity == cq->_front;
}

【1.9】循环队列判空

/* 循环队列:判断空 */
bool CyclicQueueEmpty(CQ* cq) {
    // 断言
    assert(cq);

    return cq->_back = cq->_front;
}

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

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

相关文章

MMOE(Multi-gate Mixture-of-Experts)

1.前提和动机 随着推荐技术的发展&#xff0c;目前越来越多的推荐场景&#xff0c;往往并不是单独的优化一个指标&#xff0c;比如&#xff1a; 视频推荐领域&#xff1a;推荐排序任务不仅需要考虑到用户点击率、完播率&#xff0c;也需要考虑到一些满意度指标&#xff0c;例如…

优秀java实习报告范文5篇

优秀java实习报告范文(一) 一:实习介绍 1)实习题目 学生信息管理系统的设计与开发 2)实习目的 《Java程序设计》课程是电子商务专业的一门专业必修课程&#xff0c;特针对此课程进行为期三周的实践教学&#xff0c;旨在提升本专业学生对此课程中的理论知识的综合应用能力、提高…

微信研发体系下的分布式配置系统设计实践

腾小云导读 对很多的开发者而言&#xff0c;处理运营素材反复变更等需求场景不是一件轻松的事。开发者通常需要定制化地进行数据清理、格式转换和工具开发等等。在这个时候&#xff0c;建设分布式配置系统就显得尤为重要。本文旨在分析分布式配置系统的必要性、可行性及其关键…

SpringBoot的日志

SpringBoot的日志 &#x1f50e;日志是什么&#x1f50e;日志的作用&#x1f50e;日志级别日志级别的作用日志级别的分类日志级别的设置 &#x1f50e;打印日志打印日志具体内容划分 &#x1f50e;常用的日志框架为什么这样设计对比System.out.ptintln()与日志框架 &#x1f50…

Kubernetes那点事儿——暴露服务之Ingress

Kubernetes那点事儿——暴露服务之Ingress 前言一、ingress负载均衡器Ingress Controller路由规则Ingress 二、Ingress Controller三、案例 前言 在 k8s 集群中&#xff0c;如果我们将服务暴露出来&#xff0c;提供访问&#xff0c;可以使用Nodeport方式&#xff0c;但是Nodepo…

SIG Mesh协议学习

1. 简介 Bluetooth SIG组织在2017年7月17日发布了蓝牙Mesh标准. 蓝牙Mesh不同于传统Bluetooth Low Energy(BLE)协议的1对1, 1对多的通信方式, 它实现了多对多的通信. 这使得mesh网络中的各个节点之间可以相互通信. 蓝牙Mesh协议建立在BLE的物理层和链路层之上, 也就是说它可以…

MachXO2系列 FPGA LCMXO2-7000HC-4TG144C-可编程逻辑器件介绍

莱迪思深力科MachXO2系列LCMXO2-7000HC-4TG144C是高度可配置的串行逻辑器件&#xff08;PLD&#xff09;&#xff0c;具有低误差&#xff0c;具有和高系统集成等特性。MachXO2系列逻辑密度增加了3倍&#xff0c;嵌入存储增加了10倍&#xff0c;静态降低100倍&#xff0c;而成本…

动态获取项目根目录的两种方式

说明&#xff1a;如果项目上传的文件是存储在本地的&#xff0c;为了项目可以在其他电脑上也可能正常运行&#xff0c;可以将文件上传至项目的static文件夹里&#xff0c;并将文件路径保存至数据库中&#xff0c;前端显示时使用也可以通过该路径访问。要想获取到本地项目static…

如何评估大型语言模型(LLM)?

编者按&#xff1a;近期几乎每隔一段时间&#xff0c;就有新的大语言模型发布&#xff0c;但是当下仍然没有一个通用的标准来评估这些大型语言模型的质量&#xff0c;我们急需一个可靠的、综合的LLM评估框架。 本文说明了为什么我们需要一个全面的大模型评估框架&#xff0c;并…

DOCker安装(一)

DOCker的安装 1、简介 Docker使用客户端-服务器(C/S)架构模式&#xff0c;使用远程API来管理和创建Docker容器。 Docker容器通过Docker镜像来创建。 容器之间互不干扰 容器与镜像的关系类似于面向对象编程中的对象与类。 对象->容器 镜像->类 通过镜像来创建容器 …

如何用MarkDown轻松排版和格式化文档?

前言 大家好哦&#xff01;我写作用的语言是MarkDown&#xff0c;真的非常好用&#xff0c;在本文中我将一字字的教你如何使用这个轻量化&#xff0c;容易上手的轻标记语言。 1. 什么是MarkDown MarkDown是一种轻量级的标记语言&#xff0c;它可以在文本中通过简单的标记实现…

基于Java+SpringBoot+Vue+uniapp微信小程序实现仓储管理系统

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

OpenHarmony端云一体化应用开发快速入门练习(上)基础配置

一 、整体说明 SDK版本更新说明 二、开发流程 集成SDK &#xff08;一&#xff09;前提条件 安装HUAWEI DevEco Studio 3.1及以上版本&#xff0c;配置 SDK API Version 9及以上&#xff0c;Compile SDK Version 9及以上&#xff0c;Compatible SDK Version 9及以上。 &#…

mpi实现矩阵乘法,卷积,池化(gemm,covn,pooling)

矩阵乘法&#xff1a; 卷积&#xff1a; 池化&#xff1a; Mpi基本原理&#xff1a; 1.什么是MPI Massage Passing Interface:是消息传递函数库的标准规范&#xff0c;由MPI论坛开发。 一种新的库描述&#xff0c;不是一种语言。共有上百个函数调用接口&#xff0c;提供与C和F…

【Rust日报】2023-06-16 Rust在Stack Overflow上连续8年成为最受欢迎语言(文末有彩蛋)...

推荐23个Rust Top开源项目 根据LibHunt网站Rust主题下有关统计&#xff0c;这里列出前5个Rust Top开源项目&#xff1a;deno、rust、tauri、alacritty、rustdesk。 阅读更多&#xff1a;Top 23 Rust Open-Source Projects https://www.libhunt.com/topic/rust Tweets&#xff1…

微信小程序触底加载scroll-view

微信小程序触底加载 scroll-view 了解什么是触底加载&#xff1f; 需求&#xff1a;有个固定高度的容器&#xff0c;实现容器里面的内容触底加载 1、内容盒子的高度 2、盒子里内容的总高度 3、滚动条的scrollTop 触底加载的原理就是 当里面的容器触底的时候进行分页&#xff0…

【题解】[ABC306G] Return to 1(数论)

【题解】[ABC306G] Return to 1 题目链接 ABC306G - Return to 1 题意概述 本题多测&#xff0c;\(T\) 组数据。 对于每组数据&#xff0c;给定一个 \(n\) 个点 \(m\) 条边的有向图&#xff0c;无重边自环。 问从顶点 \(1\) 出发&#xff0c;能否恰好走 \({10^{10}}^{100}\) 步…

【八大排序(七)】归并排序初级篇-递归版

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 归并排序 1. 前言2. 归并排序基本思路3. …

在数组中各位置上计算该位置以前所有元素的累加结果(Nan值视为0)numpy.nancumsum()

【小白从小学Python、C、Java】 【等级考试500强双证书考研】 【Python-数据分析】 在数组中各位置上计算该位置以前 所有元素的累加结果&#xff08;Nan值视为0&#xff09; numpy.nancumsum() [太阳]选择题 以下说法错误的是&#xff1a; import numpy as np a np.array([[n…

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入 最近入手了兮克2.5G交换机&#xff08;兮克SKS1200-8GPY1XF&#xff09;&#xff0c;有 8 个 2.5G 电口和 1 个 10G SFP 光口&#xff1b;支持多种组网模式&#xff0c;其中一种是支持使用猫棒接入&#xff0c;由路由器…