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

题目描述

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

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

你的实现应该支持如下操作:

MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。

示例:

MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
circularQueue.enQueue(1);  // 返回 true
circularQueue.enQueue(2);  // 返回 true
circularQueue.enQueue(3);  // 返回 true
circularQueue.enQueue(4);  // 返回 false,队列已满
circularQueue.Rear();  // 返回 3
circularQueue.isFull();  // 返回 true
circularQueue.deQueue();  // 返回 true
circularQueue.enQueue(4);  // 返回 true
circularQueue.Rear();  // 返回 4

提示:

所有的值都在 0 至 1000 的范围内;
操作数将在 1 至 1000 的范围内;
请不要使用内置的队列库。

解题思路

使用一个数组作为存储队列的本体,然后一个头指针指向队头,一个尾指针指向即将放入元素的空间,如果入队则尾指针下移动,如果移动到尾部则返回开头,队头同理,唯一问题是无法分辨队列为空还是队列已经满,因为此时的情况都是尾指针等于头指针,所以在申请空间时多申请一个,最后空间不存储数据,当尾指针下一位等于头指针时,则为队满,而尾指针等于头指针时,则为队空。

代码展示

class MyCircularQueue {
public:
vector<int> viQueue;
int iFront, iRear, iSize;
MyCircularQueue(int k) {
viQueue.resize(k+1, 0);
iFront = iRear = 0;
iSize = k + 1;
} bool enQueue(int value) {
if(isFull()) return false;
viQueue[iRear] = value;
iRear = (iRear + 1) % iSize;
return true;
} bool deQueue() {
if(isEmpty()) return false;
iFront = (iFront + 1) % iSize;
return true;
} int Front() {
if(isEmpty())
return -1;
return viQueue[iFront];
} int Rear() {
if(isEmpty())
return -1;
return viQueue[(iRear - 1 + iSize) % iSize];
} bool isEmpty() {
if(iFront == iRear)
return true;
return false;
} bool isFull() {
if((iRear + 1) % iSize == iFront)
return true;
return false;
}
}; /**
* Your MyCircularQueue object will be instantiated and called as such:
* MyCircularQueue* obj = new MyCircularQueue(k);
* bool param_1 = obj->enQueue(value);
* bool param_2 = obj->deQueue();
* int param_3 = obj->Front();
* int param_4 = obj->Rear();
* bool param_5 = obj->isEmpty();
* bool param_6 = obj->isFull();
*/

运行结果

最新文章

  1. Node聊天程序实例02:chat_server.js
  2. 入门HTML的回顾,小总结
  3. Oracle函数--字符串拼接
  4. 我在用的mac软件(2)-终端环境之zsh和z(*nix都适用)
  5. Vim常用操作(1)-常用指令
  6. 对于默认 Windows NT 安装的 SID 值
  7. Javascript 笔记与总结(1-2)词法分析
  8. 【Linux安全】系统资源监控与进程终止
  9. jquery实现公告上下滚动显示
  10. C#- WinForm获取 当前执行程序路径的几种方法
  11. 点击显示子菜单,离开隐藏子菜单(onmouseout下包含a标签的js解决方法)
  12. SQL Server2008 xp_cmdshell啟用
  13. TLS调试微信
  14. java学习(五)--- 方法
  15. 《Spring_four》团队作业4—基于原型的团队项目需求调研与分析
  16. 获得其他程序弹出菜单的内容(一个困扰许久的问题o(╯□╰)o)
  17. C# 图解视频教程 全集200多集
  18. 【转载】Docker 安装后 报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 解决办法
  19. DDD领域模型数据访问权限之用户权限(十)
  20. UI5-学习篇-1-Eclipse开发工具及环境搭建

热门文章

  1. JavaScript入门⑦-DOM操作大全
  2. C++面向对象程序设计期末复习笔记[吉林大学](结合历年题速成85)
  3. MongoDB - 数据模型的设计模式
  4. Go适合做什么?为何这么多人偏爱Go语言?
  5. 判断条件为NULL
  6. 解决scapy库下找不到IP,TCP模板的问题
  7. 2022年7月12,第四组,周鹏,被算法折磨的一天【哭】【哭】【哭】【puls哭】
  8. sqlSession封装以及CRUD的实现
  9. CH579(Cortex-M0)网络IAP升级介绍及问题解答--(持续更新) 网络升级
  10. 搭建一个Hexo个人博客系统