【那些年那些题】环形队列

简介: 【那些年那些题】环形队列

环形队列介绍:


在实际中,我们会用到一种特殊的队列,即环形队列,也可以叫做循环队列。在操作系统中有一个生产者消费者模型使用的就是循环队列。循环队列可以用数组实现,也可以用链表实现。

 循环队列仍是一种线性结构,它是基于队列先进先出的特性在队尾连接队头实现的,在逻辑结构上就构成了一个环状,所以被叫做环形队列、循环队列。

 循环队列的一个有点是,我们可以不断循环的利用这个队列的空间,一个普通的队列,在元素满载之后就不能再进行元素插入了,但是环形队列可以。不过会将之前的值覆盖,所以并不是所有条件下都适用。

 操作系统中的生产者消费者模型,就是典型的循环队列。用餐厅举例就是,这个餐厅只有10张桌子(10个空间),我这10张桌子没有满,顾客就可以直接上桌点菜(直接进行元素插入)。但是如果桌子使用完了,那就只有等之前的顾客吃完饭之后,后来的顾客才能上桌点菜(对首的元素已经使用完,且之后不在使用,这块空间就能够再次使用了)。


e08cfc3824fe4637861d551ecd8c7e66.png

题目链接:

  设计循环队列

代码实现:

typedef struct {
    int* a;
    int head;
    int tail;
    int k;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    //多开辟一个空间,用于判满
    obj->a = (int*)malloc(sizeof(int) * (k + 1));
    obj->head = obj->tail = 0;
    obj->k = k;
    return obj;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
    return obj->tail == obj->head;
}
bool myCircularQueueIsFull(MyCircularQueue* obj)
{
    return ((obj->tail+1) % (obj->k+1)) == obj->head;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
        return false;
    obj->a[obj->tail++] = value;
    obj->tail %= (obj->k+1);
    return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return false;
    obj->head++;
    obj->head %= (obj->k+1);
    return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->a[obj->head];
}
int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->a[(obj->tail + obj->k) % (obj->k + 1)];
}
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->a);
    free(obj);
}
/**
 * Your MyCircularQueue struct will be instantiated and called as such:
 * MyCircularQueue* obj = myCircularQueueCreate(k);
 * bool param_1 = myCircularQueueEnQueue(obj, value);
 * bool param_2 = myCircularQueueDeQueue(obj);
 * int param_3 = myCircularQueueFront(obj);
 * int param_4 = myCircularQueueRear(obj);
 * bool param_5 = myCircularQueueIsEmpty(obj);
 * bool param_6 = myCircularQueueIsFull(obj);
 * myCircularQueueFree(obj);
*/
目录
相关文章
|
11月前
|
监控 负载均衡 网络协议
OSPF在小型网络中的应用:简化配置与高效管理
OSPF在小型网络中的应用:简化配置与高效管理
402 1
【JAVA学习之路 | 进阶篇】Set及其实现类与常用方法
【JAVA学习之路 | 进阶篇】Set及其实现类与常用方法
|
数据采集 前端开发 开发者
Selenium中如何实现翻页功能
在使用Python的Selenium库进行网页爬虫开发时,翻页操作是常见需求。本文详细介绍如何通过Selenium实现翻页,包括定位翻页控件、执行翻页动作以及等待页面加载等关键步骤,并提供了基于“下一页”按钮和输入页码两种方式的具体示例代码。此外,还特别提醒开发者注意页面加载完全、动态内容加载及反爬机制等问题,确保爬虫稳定高效运行。
1240 3
|
SQL 存储 NoSQL
关系型数据库的复杂性
【5月更文挑战第1天】为了降低关系型数据库的复杂性,可以采取一些措施,如使用ORM(对象关系映射)工具来简化数据库操作、使用数据库设计工具来辅助设计和管理数据库、以及采用分布式数据库和NoSQL等技术来应对大规模数据处理的需求。
198 2
关系型数据库的复杂性
|
关系型数据库 MySQL Linux
Linux 安装 mysql【使用yum源进行安装】
这篇文章介绍了在Linux系统中使用yum源安装MySQL数据库的步骤,包括配置yum源、安装MySQL服务、启动服务以及修改root用户的默认密码。
Linux 安装 mysql【使用yum源进行安装】
|
安全 算法 Java
【C++ 友元的运用】C++深度解析:友元关系的奥秘与挑战
【C++ 友元的运用】C++深度解析:友元关系的奥秘与挑战
244 0
|
JavaScript Java 关系型数据库
旅游|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)
旅游|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)
1728 0
|
缓存 Cloud Native 应用服务中间件
云原生 Nginx安装&配置解析
【1月更文挑战第8天】云原生 Nginx安装&配置解析
|
索引
ES(elasticsearch)删除指定索引
ES(elasticsearch)删除指定索引
1058 0