【数据结构】设计环形队列

这篇具有很好参考价值的文章主要介绍了【数据结构】设计环形队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环形队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
环形队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

思路:
在环形队列中,队列为空时,队头队尾指向同一个位置。当队列不为空时,队头指向插入的第一个数据,队尾指向最后一个数据的下一个位置。当tail+1等于front时,说明环形队列已满。

注意:
环形队列的队尾不能像常规队列中队尾一样指向最后一个数据,如果这样的话,我们将不能区别环形队列的状态是空还是满,因为此时队头和队尾都指向同一个位置。这就意味着,我们必须留出一个空间,这个空间不能存放数据,这样我们才能很好的区别环形队列的状态是空还是满。

【数据结构】设计环形队列,数据结构,数据结构,c++,c语言

我们如果用一个数组来实现这个环形队列的话,上面这三种状态就对应于以下三种状态:

【数据结构】设计环形队列,数据结构,数据结构,c++,c语言

可以看出,此时这个数组和环形完全扯不上关系,这其实很简单,我们只需注意判断两个地方:
 1.当指针指向整个数组的后方的时候,让该指针重新指向数组的第一个元素。
 2.当指针指向整个数组的前方的时候,让该指针直接指向数组最后一个有效元素的后面。

这样就使得该数组在逻辑上是“环形”的了。
【数据结构】设计环形队列,数据结构,数据结构,c++,c语言

代码:文章来源地址https://www.toymoban.com/news/detail-699018.html

// 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
#include <stdbool.h>
#include <stdlib.h>
// 循环队列的结构:使用数组来存储,队头,队尾的下标,一个存储数据的数组。K表示队列长度
typedef struct
{
    int *queue;
    int front;
    int rear;
    int k;
} MyCircularQueue;

MyCircularQueue *myCircularQueueCreate(int k) {
    // 数组大小要开辟k+1 预留一个空的空间,以方便判断空和满的两种情况
    MyCircularQueue *obj = (MyCircularQueue *) malloc(sizeof(MyCircularQueue));
    obj->queue = (int *) malloc(sizeof(int) * (k + 1));
    obj->front = 0;
    obj->rear = 0;
    obj->k = k;

    return obj;
}

// 队列判空front == rear
bool myCircularQueueIsEmpty(MyCircularQueue *obj) {
    assert(obj);
    // 判空的条件是front和rear都为0
    return obj->front == obj->rear;
}

// 队列判满 (rear+1)%(k+1)=front
bool myCircularQueueIsFull(MyCircularQueue *obj) {
    assert(obj);
    // 判满的条件是队列满了,rear指向了最后一个空的数组,+1需要回到front的位置,也就是(rear+1)%(k+1)==front
    return ((obj->rear + 1) % (obj->k + 1)) == obj->front;
}

//求有效长度(rear-front+k+1)%(k+1)
int myCircularQueueLength(MyCircularQueue *obj) {
    assert(obj);

    if (myCircularQueueIsEmpty(obj))
        return 0;

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

bool myCircularQueueEnQueue(MyCircularQueue *obj, int value) {
    assert(obj);
    // 进队列  如果队列满了,就无法进队列,返回false
    if (myCircularQueueIsFull(obj))
        return false;

    obj->queue[obj->rear++] = value;
    // rear的值溢出,需要重新设置
    obj->rear %= (obj->k + 1);
    /* 也可以这么写
    if (obj->rear > obj->k)
        obj->rear = 0;
    */
    return true;
}

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

    obj->front++;
    // front溢出重新设置
    obj->front %= (obj->k + 1);
    /* 也可以这么写
    if (obj->front > obj->k)
        obj->front = 0;
    */
    return true;
}

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

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

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

    // 如果rear == 0 说明rear在最后的位置  也就是k的位置
    if (obj->rear == 0)
        return obj->queue[obj->k];
    else
        return obj->queue[obj->rear - 1];
}

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

到了这里,关于【数据结构】设计环形队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法分析】使用C语言实现队列的两种(带头结点与不带头结点)链式存储,并且给出一种循环队列的设计思想

      当我们编写程序时,经常需要处理各种数据结构。队列是一种常见的数据结构,它有着广泛的应用场景。队列的基本操作包括入队和出队,应用于模拟等待队列、消息队列、计算机缓存等场合。   在实际编程中,我们可以用不同的数据结构来实现队列。本文主要介绍了

    2024年02月08日
    浏览(118)
  • 数据结构——队列(C语言)

    本篇文章将解决一下几个问题: 队列是什么? 如何实现一个队列? 什么场景下会用队列? 队列:一种只允许一端进行插入数据操作,在另一端进行删除操作的特殊线性表。队列具有先进先出(FIFO)入队列:进行插入操作的一端称为队尾,出队列的一端叫做队头。  队列也

    2024年02月11日
    浏览(44)
  • C语言实现队列--数据结构

    😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥所属专栏:🔥魔王的修炼之路–数据结构🔥 如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的 点赞 👍和 关注 💖,支持一

    2024年02月05日
    浏览(45)
  • 数据结构:队列(Python语言实现)

    队列是一种 先进先出 的数据结构(特殊的线性结构),在队列 尾部 插入新元素,在队列 头部 删除元素。 一般队列的基本操作如下: create:创建空队列。 enqueue:将新元素加入队列的尾部,返回新队列。 dequeue:删除队列头部元素,返回新队列。 front:返回队列头部的元素

    2024年02月13日
    浏览(45)
  • c语言的数据结构:队列

    动态内存分配:链表在C语言中通常使用动态内存分配,这意味着可以在运行时根据需要动态地添加或删除节点。这对于实现一个动态大小的队列非常有用,因为队列的大小可以在运行时变化。相比之下,数组的大小通常是固定的,需要在编译时确定,这可能会限制队列的灵活

    2024年03月14日
    浏览(39)
  • 【数据结构】C语言队列(详解)

    前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现队列 目录 一.队列概念及结构 1.1队列的概念 1.2队列的结构 二.队列的实现 2.1头文件 2.2链式队列的结构定义 2.3队列接口的定义 2.4初始化队列 2.5判断队列

    2024年02月10日
    浏览(44)
  • 数据结构 队列(C语言实现)

            任其事必图其效;欲责其效,必尽其方。——欧阳修;本篇文章主要写的是什么是队列、以及队列是由什么组成的和这些组成接口的代码实现过程。( 大多细节的实现过程以注释的方式展示请注意查看 )    话不多说安全带系好,发车啦 (建议电脑观看) 。 附

    2024年02月11日
    浏览(54)
  • 队列--C语言实现数据结构

    本期带大家一起用C语言实现队列🌈🌈🌈 队列是一种线性数据结构,它按照先进先出(FIFO)的原则进行操作。可以把队列想象成排队买票或者排队上公交车的队伍。 顺序队列 由一个连续的内存区域组成,可以存储多个元素。队列有两个指针,分别指向队头(Front)和队尾(

    2024年02月16日
    浏览(37)
  • 数据结构——队列(C语言实现)

    队列是一种特殊的线性结构,数据只能在一端插入,数据也只能在另一端进行删除。插入数据的那一端称之为队尾,插入数据的动作称之为入队。删除数据的那一端称之为队头,删除数据的动作称之为出列。队列遵守的是FIFO原则(Frist In First Out),即先进先出原则。 队列具

    2024年02月03日
    浏览(79)
  • 【数据结构】队列---C语言版(详解!!!)

    队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有 先进先出FIFO (First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 入队列 :进行插入操作的一端称为队尾 出队列 :进行删除操作的一端称

    2024年02月10日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包