目录

概念

循环队列的作用

题目

注意事项

题解

用顺序表的实现

用链表的实现


概念

基于队列的先进先出的原则,在确定了队列长度的前提下,另队列首尾相接而实现的一种结构。

循环队列的作用

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-circular-queue

题目

设置循环队列

注意事项

单纯把链表的首尾相接就可以吗?

那么我们来想想这样一个问题:空的循环队列是什么样的?

我们规定将头指针放在首元素的位置,尾指针放到尾元素的下一个位置,那空队列就是头指针和尾指针指向同一个位置。

那么,满的循环链表又是什么样的呢?

尾指针放在a8元素的后面,恰好又与空链表的指向完全相同。

那我们怎么解决呢?

难道在结构体放一个变量判断它是否以满吗?不是不可以,但稍微有点“笨重”。

所以我们不妨让队列多添加一个位置,这个位置不放任何元素,仅仅是为了区别空与满:

题解

与通常队列相似,循环队列同样也可以用链表与顺序表两种方式实现

用顺序表的实现

typedef int CQDataType;
typedef struct
{CQDataType* cq;int head;int tail;int size;
} myCircularQueueEnQueue;
bool myCircularQueueEnQueueIsFull(myCircularQueueEnQueue* obj);
bool myCircularQueueEnQueueIsEmpty(myCircularQueueEnQueue* obj);
//构造器,设置队列长度为 k
myCircularQueueEnQueue* myCircularQueueEnQueueCreate(int k)
{myCircularQueueEnQueue* newCQ = (myCircularQueueEnQueue*)malloc(sizeof(myCircularQueueEnQueue));assert(newCQ);CQDataType* newcq = (CQDataType*)malloc(sizeof(CQDataType) * (k + 1));assert(newcq);newCQ->size = k;newCQ->cq = newcq;newCQ->head = 0;newCQ->tail = 0;return newCQ;
}
//向循环队列插入一个元素。如果成功插入则返回真
bool myCircularQueueEnQueueEnQueue(myCircularQueueEnQueue* obj, int value)
{if (myCircularQueueEnQueueIsFull(obj)){return 0;}obj->cq[obj->tail] = value;obj->tail = (obj->tail + 1) % (obj->size + 1);return 1;
}
//从循环队列中删除一个元素。如果成功删除则返回真
bool myCircularQueueEnQueueDeQueue(myCircularQueueEnQueue* obj)
{if (myCircularQueueEnQueueIsEmpty(obj)){return 0;}//obj->head = ((obj->size + 1) + (obj->tail - 1)) % (obj->size + 1);obj->head = (obj->head + 1) % (obj->size + 1);return 1;
}
//从队首获取元素。如果队列为空,返回 -1
int myCircularQueueEnQueueFront(myCircularQueueEnQueue* obj)
{if (obj->head == obj->tail){return -1;}else{return obj->cq[obj->head];}
}
// 获取队尾元素。如果队列为空,返回 -1
int myCircularQueueEnQueueRear(myCircularQueueEnQueue* obj)
{if (obj->head == obj->tail){return -1;}else{return obj->cq[((obj->size + 1) + (obj->tail - 1)) % (obj->size + 1)];}
}
//检查循环队列是否为空
bool myCircularQueueEnQueueIsEmpty(myCircularQueueEnQueue* obj)
{return obj->head == obj->tail;
}
//检查循环队列是否已满
bool myCircularQueueEnQueueIsFull(myCircularQueueEnQueue* obj)
{return (obj->tail + 1) % (obj->size + 1) == obj->head;
}
//释放
void myCircularQueueEnQueueFree(myCircularQueueEnQueue* obj)
{free(obj->cq);free(obj);
}

用链表的实现

typedef int CQDataType;
typedef struct CQListNode
{struct CQListNode* _next;CQDataType _data;
}CQNode;
typedef struct
{CQNode* _head;CQNode* _tail;int size;
} MyCircularQueue;
bool myCircularQueueIsFull(MyCircularQueue* obj);
bool myCircularQueueIsEmpty(MyCircularQueue* obj);MyCircularQueue* myCircularQueueCreate(int k)
{MyCircularQueue* CQ = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));assert(CQ);CQ->size = k;CQNode* head = (CQNode*)malloc(sizeof(CQNode));assert(head);CQNode* cur = CQ->_head = CQ->_tail = head;for (int i = 0; i < k; i++)//加上面共k+1个节点{CQNode* cq = (CQNode*)malloc(sizeof(CQNode));assert(cq);cur->_next = cq;cq->_next = NULL;cur = cur->_next;}cur->_next = head;return CQ;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{if (!myCircularQueueIsFull(obj)){obj->_tail->_data = value;obj->_tail = obj->_tail->_next;return 1;}else{return 0;}}bool myCircularQueueDeQueue(MyCircularQueue* obj)
{if (!myCircularQueueIsEmpty(obj)){obj->_head = obj->_head->_next;return 1;}else{return 0;}
}int myCircularQueueFront(MyCircularQueue* obj)
{if (!myCircularQueueIsEmpty(obj))return obj->_head->_data;elsereturn -1;
}int myCircularQueueRear(MyCircularQueue* obj)
{if (!myCircularQueueIsEmpty(obj)){CQNode* cur = obj->_head;while (cur->_next != obj->_tail){cur = cur->_next;}return cur->_data;}elsereturn -1;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{return obj->_head == obj->_tail;
}bool myCircularQueueIsFull(MyCircularQueue* obj)
{return obj->_tail->_next == obj->_head;
}void myCircularQueueFree(MyCircularQueue* obj)
{/*CQListNode* cur = obj->_head;while(cur->_next!=cur)*/CQNode* cur = obj->_head;CQNode* next = NULL;for (int i = 0; i < obj->size; i++){next = cur->_next;free(cur);cur = next;}free(obj);
}

数据结构——循环队列相关推荐

  1. python环形队列_Python 实现数据结构-循环队列的操作方法

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  2. 循环队列的java结构_Java数据结构——循环队列

    普通顺序队列存在的问题 在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后 ...

  3. 数据结构--循环队列

    循环队列 图片讲解

  4. [数据结构]-循环队列

    循环队列 package com.cn.jichu.day09;public class LoopQueue<E> {/*** 数组*/private E[] data;/*** 头指针, ...

  5. 数据结构循环队列C++实现

    1.队列的概念 队列只允许在表的一端插入,另一端删除.允许插入的一端叫做队尾,允许删除的一端叫做对首.队列的特性叫"先进先出".和栈一样,队列的存储形式也有两种,基于数组的存储表示 ...

  6. 数据结构-循环队列(C语言代码)

    循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用.在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可 ...

  7. Python写数据结构:循环队列

    #!/usr/bin/python3.5 #_*_coding:utf-8_*_class Queue():def __init__(self,capacity):self.queue = [None ...

  8. c语言 数据结构 循环队列

    #include<stdio.h> #include<stdlib.h> #define QueueSize 100 typedef char DataType; typede ...

  9. 数据结构之——队列与循环队列

    数据结构学习之--队列与循环队列 什么是队列(Queue) 队列基于动态数组的实现及时间复杂度分析 优化队列 循环队列(LoopQueue) 什么是队列(Queue) 队列(Queue)同栈(stac ...

  10. 【数据结构】队列-顺序队列、循环队列、链队、双端队列

    定义 队列是只允许在一端进行插入,而在另一端进行删除的线性表. 队头(Front):允许删除的一端,又称为队首. 队尾(Rear): 允许插入的一端. 先进入队列的元素必然先离开队列,即先进先出(Fi ...

最新文章

  1. Android Dialog 关闭的时候标题栏闪烁一下的处理方法
  2. python web为什么不火-Python语言为什么这么火?老男孩Python入门培训
  3. ASIHTTPRequest类库简介和使用说明
  4. WP SyntaxHighlighter 初探
  5. 【须弥SUMERU】宜信分布式安全服务编排实践
  6. 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinjazz/archive/2009/04/29/4138000.aspx...
  7. 【C++ Primer】第十五章 友元、异常和其他 --之一---友元和嵌套类
  8. Scale-Adaptive Neural Dense Features: Learning via Hierarchical Context Aggregation
  9. GitLab 5.3 升级注意事项
  10. 操作系统定义、功能、特征、分类介绍
  11. 短视频去水印解析二次运用--全网短视频解析去水印软件
  12. python :alpha shapes 算法检测边界点
  13. 关于ioncube的license破解
  14. 十年深圳人,是真的吗?
  15. 消防联动控制系统服务器,火灾自动报警消防联动控制系统报价单V4.4.xls
  16. bilibili弹幕爬虫, 2019-1-10
  17. 私网地址与公网地址是如何转换的?
  18. resultful接口开发
  19. 浅谈Java设计之——Java初始化数组(List/Map)时为何要空数组而不是null
  20. 企业网站推广步骤有哪些?

热门文章

  1. verilog 实战 与非门
  2. 怎么将计算机的网络恢复连接,win7怎么还原网络设置 win7本地连接不上的解决方法...
  3. 高等数学笔记:两个重要极限
  4. http接口 Spring boot中的Http压缩配置gzip
  5. vs登录或者添加账户时说脚本错误
  6. 模拟电子技术 项目课 多种波形发生器(方波、三角波、正弦波)
  7. 互联网日报 | 虎牙与斗鱼官宣合并;国内第四大运营商中国广电成立;拍拍贷完成存量业务清退...
  8. 电视剧《大秦赋》最近很火!于是我用Python抓取了“相关数据”,发现了这些秘密.........
  9. C# 将word/ppt文档转换为Pdf的三种方法
  10. lombok报错Ambiguous method call. Both