【刷题记录】详谈设计循环队列

简介: 【刷题记录】详谈设计循环队列

下题目为个人的刷题记录,在本节博客中我将详细谈论设计循环队列的思路,并给出代码,有需要借鉴即可。

题目:LINK

循环队列是线性表吗?或者说循环队列是线性结构吗?

对于这个问题,我们来看一下线性结构的定义:

因为循环队列结点个数为k个,且具有逻辑结构性,因此属于一种特殊的线性结构

下面是思路分析:

首先一开始收到实现普通队列的思路影响+上题目中循环这俩字,那自然想到的是用链表来设计循环队列。

于是,为了便于分析我作了下面的草图:

现在我们一开始迎来了第一个问题:我们的头指针和尾指针初始化放到哪里?

为了解决这个问题,我想到了第一个方法:初始化头指针尾指针置为空

这个方法看似很好,但是结合一下我们要实现的接口,判空时候需要做特殊处理,其实并不是很好。

然后我又想到,那让他们一开始直接都指向第一个结点

我们继续往下想,如果这样做的化,还是那个问题,如何区分空队列与一个结点的情况?

那么为了解决这个区分问题,我们可以引入size来统计结点个数

不过这里还有个问题,如果front与rear初始化指向第一个结点,然后引入size来区分结点个数的话,我们发现rear是指向尾结点的后一个结点的,也就是说我们在搞取尾接口的时候并不好操作,因为这是单向链表。

那为了解决取尾接口问题,我们要把单链表改成双向链表

但是这样一来,工作量就要变大很多,并不是很好的选择。

所以,不妨我们来用一下数组:

1.为了解决两个指针一开始都指向第一个空间特殊处理的问题,所以我们选择rear指向尾结点的后一个结点
2.为了解决不好判断的问题,我们多开一个空间,用rear+1 == front 为满的条件
3.为了解决数组循环问题,我们可以取模

下面是示例代码:

typedef struct {
    int front;//头元素
    int rear;//尾元素的下一个
    int* arr;//数组指针
    int k;
} MyCircularQueue;
//检查循环队列是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if(obj->front == obj->rear)
    {
        return true;
    }
    else
    {
        return false;
    }
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if((obj->rear+1)%(obj->k+1)==obj->front)
    {
        return true;
    }
    else
    {
        return false;
    }
}
//构造器,设置队列长度为 k 
MyCircularQueue* myCircularQueueCreate(int k) {
    //首先创造出一个MyCircularQueue结构体,为方便操作数组做铺垫
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    //数组空间申请+初始化结构体
    obj->arr = (int*)malloc((k+1)*sizeof(int));
    obj->k = k;
    obj->front = obj->rear = 0;
    //返回结构体指针
    return obj;
}
//向循环队列插入一个元素。如果成功插入则返回真
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    //满了
    if(myCircularQueueIsFull(obj))
    {
        return false;
    }
    else//没满
    {
        obj->arr[obj->rear++] = value;//放入数据并移动尾指针
        obj->rear = obj->rear % (obj->k+1);//循环
        return true;
    }
}
//从循环队列中删除一个元素。如果成功删除则返回真
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    //空的
    if(myCircularQueueIsEmpty(obj))
    {
        return false;
    }
    else//非空
    {
        obj->front++;
        obj->front %= (obj->k+1);
        return true;
    }
}
//从队首获取元素。如果队列为空,返回 -1 
int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))//为空
    {
        return -1;
    }
    else//非空
    {
        return obj->arr[obj->front];
    }
}
//获取队尾元素。如果队列为空,返回 -1 
int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))//为空
    {
        return -1;
    }
    else
    {
        int prear = ((obj->rear + obj->k)%(obj->k+1));
        return obj->arr[prear];
    }
}
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->arr);
    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);
*/

完。


相关文章
|
机器学习/深度学习 存储 算法
深度学习中的稀疏注意力
深度学习中的稀疏注意力
763 0
|
机器学习/深度学习 算法 数据建模
探索XGBoost:时间序列数据建模
探索XGBoost:时间序列数据建模
507 2
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
11月前
|
人工智能 算法 安全
【独家解密】如何在一个多月内高效完成多模态算法备案?一次性通过攻略大公开
在AI高速发展的时代,算法备案是产品上线的必备资质。本文分享了如何在短短一个多月内一次性通过算法备案的成功经验。筹备阶段包括网站注册、公司资料准备、算法制度及安全保障的制定;技术资料准备阶段确保算法描述清晰、流程精确、风险防控到位;提交后耐心等待审核结果,最终成功公示。关键在于充分准备和团队协作,希望这些经验能助你顺利通过备案。
|
资源调度
安装项目的时候老是报错:Command failed.
安装项目的时候老是报错:Command failed.
382 122
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
665 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
Android开发
Android系统开发中产品信息文件说明
Android系统开发中产品信息文件说明
287 1
|
Android开发 UED Kotlin
kotlin webview 加载网页失败后如何再次重试
在Kotlin中,当使用WebView加载网页失败时,可通过设置WebViewClient并覆盖`onReceivedError`方法来捕获失败事件。在该回调中,可以显示错误信息或尝试使用`reload()`重试加载。以下是一个简要示例展示如何处理加载失败
|
SQL 数据处理 调度
实时计算 Flink版产品使用合集之实现批量抽取如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
JavaScript Java 测试技术
Java项目基于ssm+vue.js图书管理系统的附带文章和源代码设计说明文档ppt
Java项目基于ssm+vue.js图书管理系统的附带文章和源代码设计说明文档ppt
198 0

热门文章

最新文章