当前位置: 首页 > article >正文

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

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

在这里插入图片描述

在这里插入图片描述

各个接口的实现

创建队列:

typedef struct {
    int* a;
    int front;
    int back;
    int k;
    
} MyCircularQueue;

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

初始化队列:

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;
    
}

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

判断队列是否为满:

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

back+1==front的话就为满,如果我们的循环队列多循环几次,那么我们的下标大小就会大于我们的数组的长度,所以我们需要模上我们的长度,如果我们的back+1模上k+1的 ==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;    
}

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

队列删除数据:

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

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

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

返回队列首元素:

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)];
    
}

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

完整代码展现:

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

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


http://www.kler.cn/a/160086.html

相关文章:

  • python selenium库的使用:通过兴趣点获取坐标
  • 《TCP/IP网络编程》学习笔记 | Chapter 10:多进程服务器端
  • MySQL技巧之跨服务器数据查询:基础篇-更新语句如何写
  • java面试题(jvm)
  • 提高数据处理效率:JavaScript 操作 XLSX 文件的最佳实践
  • opc da 服务器数据 转 IEC61850项目案例
  • 【Qt之QSqlRelationalTableModel】描述及使用
  • 【微信小程序】保存多张图片到本地相册 wx.saveImageToPhotosAlbum
  • 分支和循环
  • 目标检测——R-CNN算法解读
  • web理论测试
  • Insomnia -- 非常nice的开源 API 调试工具
  • Camunda 7.x 系列【57】流程设计器
  • Axios详解及运用案例
  • 详细学习PyQt5中的多线程
  • ubuntu下QT搭建Android开发环境
  • Linux C语言 42-进程间通信IPC之网络通信(套接字)
  • 基于springboot+vue篮球联盟管理系统源码
  • 基于Vue.js的厦门旅游电子商务预订系统的设计和实现
  • String转Date,Date转String
  • ElasticSearch之Search settings
  • MongoDB导入导出命令
  • 配置OSS后如何将服务器已有文件上传至OSS,推荐使用ossutil使用
  • C++ 红黑树的封装
  • selinux-policy-default(2:2.20231119-2)软件包内容详细介绍(6)
  • 虚拟化逻辑架构:OVS 交换机与端口管理