实战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);
}

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

相关推荐
想回家的一天20 小时前
ECONNREFUSED ::1:8000 前端代理问题
开发语言
cike_y20 小时前
Mybatis之解析配置优化
java·开发语言·tomcat·mybatis·安全开发
Jay_Franklin1 天前
SRIM通过python计算dap
开发语言·python
Slow菜鸟1 天前
Java基础架构设计(三)| 通用响应与异常处理(分布式应用通用方案)
java·开发语言
消失的旧时光-19431 天前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
wadesir1 天前
Rust中的条件变量详解(使用Condvar的wait方法实现线程同步)
开发语言·算法·rust
tap.AI1 天前
RAG系列(二)数据准备与向量索引
开发语言·人工智能
阿蒙Amon1 天前
C#每日面试题-重写和重载的区别
开发语言·c#
是一个Bug1 天前
Java基础20道经典面试题(二)
java·开发语言
yugi9878381 天前
基于MATLAB实现协同过滤电影推荐系统
算法·matlab