📅  最后修改于: 2023-12-03 15:26:09.161000             🧑  作者: Mango
在队列的基础上,我们可以实现一个循环队列。循环队列的特点是:队列的尾部连接到队列的头部,形成一个环形结构。这种实现方式可以更有效地利用队列的存储空间,避免队列满时出现无法插入元素的情况,并且可以实现队列的“复用”。
循环队列的实现需要以下几个要素:
在循环队列中,需要对数组的下标进行取模操作,以实现队列的循环。
下面是一个简单的循环队列实现:
class MyCircularQueue:
def __init__(self, k: int):
self.queue = [0] * k
self.head = 0
self.tail = 0
self.length = 0
def enQueue(self, value: int) -> bool:
if self.isFull():
return False
self.queue[self.tail] = value
self.tail = (self.tail + 1) % len(self.queue)
self.length += 1
return True
def deQueue(self) -> bool:
if self.isEmpty():
return False
self.head = (self.head + 1) % len(self.queue)
self.length -= 1
return True
def Front(self) -> int:
if self.isEmpty():
return -1
return self.queue[self.head]
def Rear(self) -> int:
if self.isEmpty():
return -1
return self.queue[self.tail - 1]
def isEmpty(self) -> bool:
return self.length == 0
def isFull(self) -> bool:
return self.length == len(self.queue)
在循环队列中,入队、出队、获取队头元素、获取队尾元素的时间复杂度均为 O(1)。因为队列的头部和尾部指针可以用指针相加的方式来更新。
循环队列在解决具体问题时,使用方法与普通队列类似,只是需要注意队列满时的条件。
例如,我们可以使用循环队列来解决下面的问题:
以下是具体的代码实现:
def circularEnqueue(n, m):
queue = MyCircularQueue(n)
for i in range(1, n+1):
queue.enQueue(i)
for i in range(m):
print(queue.Front())
queue.deQueue()
在这个例子中,我们利用循环队列实现了一个长度为 n 的队列,并依次将 1~n 的整数入队。然后对队列执行 m 次出队操作,并输出每次出队的元素值。
循环队列是一种常见的数据结构,用于实现队列的“复用”和更有效的存储。在实现循环队列时,需要注意队列满时的条件。在解决具体问题时,循环队列和普通队列的使用方法类似,只需要注意队列满时的情况。