当前位置:网站首页>LeetCode中等题之设计循环队列
LeetCode中等题之设计循环队列
2022-08-04 09:15:00 【·星辰大海】
题目
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 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 的范围内;
请不要使用内置的队列库。
来源:力扣(LeetCode)
解题思路
循环队列的设计有好几种方式,可以采用留下一个空白位置的方法来判断队列的满或者空也可以使用队列长度计数的方法,还有队列的操作记录法。rear和front指针也可以有好多种位置关系,在这里我们采用rear=front=0开始,判断队列的满和空采用队列操作记录的方法。
class MyCircularQueue:
def __init__(self, k: int):
self.k=k
self.Queue=[None]*k
self.rear,self.front,self.flag=0,0,False
def enQueue(self, value: int) -> bool:
if self.isFull():
return False
self.Queue[self.rear]=value
self.rear=(self.rear+1)%self.k
self.flag=True
return True
def deQueue(self) -> bool:
if self.isEmpty():
return False
self.front=(self.front+1)%self.k
self.flag=False
return True
def Front(self) -> int:
return -1 if self.isEmpty() else self.Queue[self.front]
def Rear(self) -> int:
return -1 if self.isEmpty() else self.Queue[(self.rear+self.k-1)%self.k]
def isEmpty(self) -> bool:
return True if self.front==self.rear and not self.flag else False
def isFull(self) -> bool:
return True if self.front==self.rear and self.flag else False
# Your MyCircularQueue object will be instantiated and called as such:
# obj = MyCircularQueue(k)
# param_1 = obj.enQueue(value)
# param_2 = obj.deQueue()
# param_3 = obj.Front()
# param_4 = obj.Rear()
# param_5 = obj.isEmpty()
# param_6 = obj.isFull()
边栏推荐
- MindSpore:model.train中的dataset_sink_mode该如何理解?
- 2022年制冷与空调设备运行操作特种作业证考试题库及模拟考试
- async - await
- 请问下Flink SQL如何写hologres分区表?我想要每天一个分区
- Apache Druid 实时分析数据库入门介绍
- 四大网络攻击常见手段及防护
- [Cloud Residency Co-Creation] HCSD Celebrity Live Streaming – Employment Guide
- 递归思想
- MindSpore:Batchnorm only support nchw input!
- 我和 TiDB 的故事 | 缘份在,那就终是能相遇的
猜你喜欢
随机推荐
JSP基本语法
2022年制冷与空调设备运行操作特种作业证考试题库及模拟考试
Since his 97, I roll but he...
leetcode二叉树系列(二)
抬升市场投资情绪,若羽臣是否还需“自身硬”?
Fiddler(一)安装
How to import data from PG to kingbaseES
王爽汇编语言第四章:第一个程序
Interview at 14:00 in the afternoon, I came out at 14:08 with my head down, asking too much...
Unity3D 数据加密
交换机链路聚合详解【华为eNSP】
[Punctuality Atom STM32 Serial] Chapter 3 Development Environment Construction Excerpted from [Punctual Atom] MiniPro STM32H750 Development Guide_V1.1
四大网络攻击常见手段及防护
Fiddler(二)-手机抓包502错误解决方法
The separation configuration Libpq is supported, speaking, reading and writing
TiDB升级与案例分享(TiDB v4.0.1 → v5.4.1)
leetcode经典例题——49.字母异位词分组
我和 TiDB 的故事 | 缘份在,那就终是能相遇的
layout manager
Producer and Consumer Problems in Concurrent Programming