设计循环队列
🎯 问题描述(来源于LeetCode)
描述:
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
-
MyCircularQueue(k): 构造器,设置队列长度为 k 。
-
Front: 从队首获取元素。如果队列为空,返回 -1 。
-
Rear: 获取队尾元素。如果队列为空,返回 -1 。
-
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
-
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
-
isEmpty(): 检查循环队列是否为空。
-
isFull(): 检查循环队列是否已满。
说明:
-
所有的值都在 0 至 1000 的范围内;
-
操作数将在 1 至 1000 的范围内;
-
请不要使用内置的队列库。
示例:
-
示例 1:
1 2 3 4 5 6 7 8 9 10
| 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
|
💻 解题思路
思路1:数组实现
思路1:代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| class MyCircularQueue:
def __init__(self, k: int): self.len=k+1 self.queue=[0 for _ in range(k+1)] self.front=0 self.rear=0
def enQueue(self, value: int) -> bool: if self.isFull(): return False self.rear=(self.rear+1)%self.len self.queue[self.rear]=value return True
def deQueue(self) -> bool: if self.isEmpty(): return False self.front=(self.front+1)%self.len return True
def Front(self) -> int: if self.front==self.rear: return -1 else: return self.queue[(self.front+1)%self.len]
def Rear(self) -> int: if self.front==self.rear: return -1 else: return self.queue[self.rear]
def isEmpty(self) -> bool: if self.front==self.rear: return True else: return False
def isFull(self) -> bool: if (self.rear+1)%self.len==self.front: return True else: return False
|
思路1:📊 性能分析
提交结果
- 运行时间:11ms击败38.97%
- 内存消耗:19.65MB击败66.51%
复杂度验证
- 时间复杂度:O(N)
- 空间复杂度:O(N)
思考