实战oj题——设计循环队列

前言:今天我们来实现循环队列。

各个接口的实现

创建队列:

c 复制代码
typedef struct {
    int* a;
    int front;
    int back;
    int k;
    
} MyCircularQueue;

我们的队列是由数组储存的,所以我们队列中得定义一个数组,front代表我们的首元素,back指向的是我们数组中的下一个元素,k则是长度。

初始化队列:

c 复制代码
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    obj->a=(int*)malloc(sizeof(int)*(k+1));
    obj->front=0;
    obj->back=0;
    obj->k=k;
    return obj;
}

判断队列为空:

c 复制代码
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front==obj->back;
    
}

front代表我们的数组的头元素下标,back指向我们的队尾元素下标的下一个,如果我们的front=back,那么为空。

判断队列是否为满:

c 复制代码
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->back+1)%(obj->k+1)==obj->front;
    }

back+1==front的话就为满,如果我们的循环队列多循环几次,那么我们的下标大小就会大于我们的数组的长度,所以我们需要模上我们的长度,如果我们的back+1模上k+1的 ==front那么就为满。

队列插入数据:

c 复制代码
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
    return false;

    obj->a[obj->back]=value;
   obj-> back++;
    obj->back%=(obj->k+1);
    return true;    
}

我们的back指向的是我们队尾元素的下一个,所以我们在给队列赋值之后,但是我们的back可能大于数组的长度,所以我们的back需要模上数组的长度。

队列删除数据:

c 复制代码
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return false;

    ++obj->front;
    obj->front%=(obj->k+1);
    return true;    
}

我们只要front++访问下一个就能将队列首元素删除,我们现在的front就是首元素的下标,我们的front同样可能大于数组长度,我们同样需要模上数组长度。

返回队列首元素:

c 复制代码
int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return -1;

    return obj->a[obj->front];
    
}

获取队尾元素:

c 复制代码
int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return -1;

    return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)];
    
}

我们的back指向的是队尾元素的下一个元素,我们的队尾元素的下标就为back-1,如果我们的back为0的话就会引起错误,所以我们加上一个数组长度,我们的队尾元素的下标也可能大于数组长度,所以我们还要模上一个数组长度。

完整代码展现:

c 复制代码
typedef struct {
    int* a;
    int front;
    int back;
    int k;
    
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    obj->a=(int*)malloc(sizeof(int)*(k+1));
    obj->front=0;
    obj->back=0;
    obj->k=k;
    return obj;
}
    

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front==obj->back;
    
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->back+1)%(obj->k+1)==obj->front;
    }

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
    return false;

    obj->a[obj->back]=value;
   obj-> back++;
    obj->back%=(obj->k+1);
    return true;
    
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return false;

    ++obj->front;
    obj->front%=(obj->k+1);
    return true;

    
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return -1;

    return obj->a[obj->front];
    
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return -1;

    return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)];
    
}



void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->a);
    free(obj);
}

如果对大家有所帮助的话,就支持一下吧!

相关推荐
船厂电气自动化ai大模型3 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光3 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
汉字萌萌哒3 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter3 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
汉字萌萌哒4 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院4 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
小雨笙笙5 小时前
C语言:变量三属性——存储类型
c语言·开发语言
zlinear数据采集卡5 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴5 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学
果果燕5 小时前
C++ 学习笔记(二):类与对象—— 构造函数与析构函数
开发语言·c++