首页 > 其他分享 >以数组为基础实现循环队列

以数组为基础实现循环队列

时间:2024-05-06 19:33:39浏览次数:23  
标签:CirQueue 下标 队列 入队 Manager 循环 数组

/****************************************************************
 * name;CirQueue_Create
 * function: 创建循环队列
 * parameter;unsighed int size
 * ReValue;CirQueue_t *
 * author;小北blog
 * attention;
 * date;2024.04.26
 * history;
 * version;
 * Copyright(c) 2024 [email protected] All rights Reserved
 *****************************************************************/

// 对将要处理的数据类型取别名,用户可以根据要求需要修改
typedef int DataType_t;
/*构造一个循环队列CircularQueue用来记录各项参数(循环队列的首地址 循环队列的容量
循环队列的循环队列的队首下标和队尾下标)并对结构体数据类型取别名*/
typedef struct CircularQueue
{
    DataType_t *Adrr;  // 记录循环队列首地址
    unsigned int Size; // 记录循环列表容量大小
    int Rear;          // 记录循环队列队尾下标
    int Front;         // 记录循环队列队首下标
} CirQueue_t;

//(1)创建循环队列并对循环队列进行初始化,要申请管理指针和需要结构体中的指针申请内存
CirQueue_t *CirQueue_Circular(unsigned int size)
{
    // 1.利用calloc为循环队列的结构体创建一个管理的指针并申请内存
    CirQueue_t *Manager = (CirQueue_t *)calloc(1, sizeof(CirQueue_t));
    // 判断是否申请成功
    if (Manager == NULL)
    {
        perror("calloc memory for Manager failed!!!");
        exit(-1); // 申请失败程序退出
    }
    // 2.利用calloc申请指针指向的空间申请内存
    Manager->Adrr = (DataType_t *)calloc(size, sizeof(DataType_t));
    // 判断是否申请成功
    if (Manager->Adrr == NULL)
    {
        perror("calloc memory for Manager failed!!!");
        free(Manager); // 申请失败释放前面申请成功的指针的内存防止内存溢出
        exit(-1);      // 申请失败程序退出
    }
    // 3.初始化结构体其他的类型(循环队列容量 队尾下标 队首下标)
    Manager->Front = 0;   // 对队首初始化
    Manager->Rear = 0;    // 对队尾初始化
    Manager->Size = size; // 对循环队列的容量初始化

    return Manager; // 返回管理指针
}
//(2)创建判断队列是否已满或已空供出队入队函数使用
/****************************************************************
 * name;CirQueue_Full
 * function: 判断队列是否满
 * parameter;CirQueue_t *Manager
 * ReValue;bool
 * author;小北blog
 * attention;
 * date;2024.04.26
 * history;
 * version;
 * Copyright(c) 2024 [email protected] All rights Reserved
 *****************************************************************/
bool CirQueue_Full(CirQueue_t *Manager)
{
    return ((Manager->Rear + 1) % Manager->Size == Manager->Front) ? true : false;
}
/*
空间换时间的案例,当最后一个元素不储存数据时,可以不用循环来判断循环队列是否未满,因为
循环队列为空的时候,队首队尾下标都是0,为满的时候也就是size大小的每个元素都存入数据的
时候,这时候队首队尾的下标也都是0,所以可以舍弃一个数据位来做判断是否未满,可以存入的
数据就为size-1个元素,即为满。存入数据满是队尾下标到了size位置,数据存满,为了防止下标
越界,Rear队尾下标等于size大小的时候等于零,也就是指向了队首。
*/

/****************************************************************
 * name;CirQueue_Empty
 * function: 判断队列是已空
 * parameter;CirQueue_t *Manager
 * ReValue;bool
 * author;小北blog
 * attention;
 * date;2024.04.26
 * history;
 * version;
 * Copyright(c) 2024 [email protected] All rights Reserved
 *****************************************************************/
bool CirQueue_Empty(CirQueue_t *Manager)
{
    return (Manager->Rear == Manager->Front) ? true : false;
}

/****************************************************************
 * name;CirQueue_Enqueue
 * function: 队列队尾入队
 * parameter;
 *          @CirQueue_t *Manager
 *          @DataType_t data
 * ReValue;bool
 * author;小北blog
 * attention;
 * date;2024.04.26
 * history;
 * version;
 * Copyright(c) 2024 [email protected] All rights Reserved
 *****************************************************************/
//(3)把需要插入到循环队列的元素按照“先进先出”进行入队,此时需要从队列队尾入队
// 入队
bool CirQueue_Enqueue(CirQueue_t *Manager, DataType_t data) // 入队需要管理指针,传入的数据
{
    // 1.判断队列是否为满
    if (CirQueue_Full(Manager))
    {
        printf("CirQueue is Full");
        return false;
    }
    // 2.如果队列有空闲的空间,把数据添加到队列尾部
    Manager->Adrr[Manager->Rear] = data;
    // 防止队尾下标越界
    Manager->Rear = (Manager->Rear + 1) % Manager->Size;
    return true;
}

/****************************************************************
 * name;CirQueue_Dequeue
 * function: 队列队首出队
 * parameter;CirQueue_t *Manager
 * ReValue;temp
 * author;小北blog
 * attention;
 * date;2024.04.26
 * history;
 * version;
 * Copyright(c) 2024 [email protected] All rights Reserved
 *****************************************************************/

//(4)把需要插入到循环队列的元素按照“先进先出”进行出队,此时需要从队列队首出队
// 出队
DataType_t CirQueue_Dequeue(CirQueue_t *Manager) // 出队需要管理指针
{
    // 备份出队的元素
    DataType_t temp = 0;
    // 1.判断队列是否为空
    if (CirQueue_Empty(Manager))
    {
        printf("CirQueue is empty");
        return false;
    }
    // 2.把队首元素出队,赋值到备份好的变量当中
    temp = Manager->Adrr[Manager->Front];
    // 防止队尾下标越界
    Manager->Front = (Manager->Front + 1) % Manager->Size;
    return temp;
}

思路和步骤
(1)创建循环队列并对循环队列进行初始化,要申请管理指针和需要结构体中的指针申请内存
(2)创建判断队列是否已满或已空供出队入队函数使用
(3)把需要插入到循环队列的元素按照“先进先出”进行入队,此时需要从队列队尾入队
(4)把需要插入到循环队列的元素按照“先进先出”进行出队,此时需要从队列队首出队

标签:CirQueue,下标,队列,入队,Manager,循环,数组
From: https://www.cnblogs.com/ikunkunkun/p/18160949

相关文章

  • 在A数组中删除B数组中出现的所有字母
    数据结构笔试题:设计一程序实现功能,处理字符串A,处理规则是:只要B字符串里面有的字母,不分大小写,一律从A字符串中删掉。#include<stdio.h>#include<string.h>char*string(char*strA,constchar*strB){inth=0;intsizeA=strlen(strA);intsizeB=strlen(st......
  • 高性能摩托车灯降压恒流ic全亮/半亮/循环模式短路保护AP5126
    AP5126是一款PWM工作模式,高效率、外围简单、内置功率管,适用于12-80V输入的高精度降压LED恒流驱动芯片。输出最大功率可达15W,最大电流1.2A。AP5126可实现全亮/半亮功能切换,通过MODE切换:全亮/半亮/循环模式。AP5126工作频率固定在140KHZ,同时内置抖频电路,可以降低对......
  • CF1967C. Fenwick Tree-算子展开,树状数组的结构
    link:https://codeforces.com/problemset/problem/1967/C题意:定义\(f(a)=s\)中的\(f\)表示把序列\(a\)映射为其树状数组的操作(\(s\)就是对应的树状数组),并且操作是在取模下作的,已知\(f^k(a)=b\),已知序列\(b\)和自然数\(k\),求\(a\).\(1\leqn\leq2\times10^5,1\leq......
  • 《代码随想录》-1.数组理论基础
    特点:1.内存空间-连续存放——>增删元素麻烦2.数据-相同类型3.下标从0开始注意:数组的元素采用覆盖的形式二维数组在内存的空间地址:1.C++中二维数组在地址空间上是连续的2.Java中二维数组每一行的头节点的地址是没有规则的......
  • 高一下三调|ssy的队列|hash dp|题解
    SSY的队列题目链接解析:考场上看到这个题第一眼是绝望的,毕竟数论咱是一窍不通.但是往下细看了看这个数据范围,N是很小的,就想了想模拟.然而只骗到10分.这个题绩效较高的解法是状压dp,在N<15的范围之内均可薄纱(ppllxx_9G也是成功拿到这70rank1了orz),可得70,但是一到后......
  • c#删除有序数组中的重复项
    我写的:publicintRemoveDuplicates(int[]nums){intlength=nums.Length;intlow=0;for(inti=0;i<length;i++){intnum=nums[i];while(num!=nums[low]){num......
  • 06.数组
    1.数组概述数组是相同类型数据的有序集合;数组描述的是相同类型的若干各数据,按照一定的先后次序排列组合而成;其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。2.数组声明创建首先必须声明数组变量,才能在程序中使用数组:dataType[]arrayRefvar;//首......
  • 【DP】【分治】最大子数组和
    题源不要太激动,过拟合,一上来就开dp,这道题只用一个变量就可以记录前缀和了【转载】我觉得这道题目的思想是:走完这一生如果我和你在一起会变得更好,那我们就在一起,否则我就丢下你。我回顾我最光辉的时刻就是和不同人在一起,变得更好的最长连续时刻classSolution:defmaxSu......
  • 【DP】乘积最大子数组
    题源思路和算法如果我们用fmax(i)来表示以第i个元素结尾的乘积最大子数组的乘积,a表示输入参数nums,那么根据「53.最大子序和」的经验,我们很容易推导出这样的状态转移方程:fmax(i)=max{f(i-1)×a[i],a[i]}它表示以第i个元素结尾的乘积最大子数组的乘积可以考虑a[i]......
  • 利用两个栈实现队列结构——“先进先出”
    请利用两个找sl和s2来模拟一个队列,假设栈中元素为int型,栈中元素最多为maxSize。已知栈的3个运算定义如下。push(ST,x):元素x入ST栈。pop(ST,&x):ST栈顶元素出栈,赋给变量x。isEmpty(ST):判断ST栈是否为空。如何利用栈的运算来实现该队列的3个运算:enQueue(元......