循环队列的关键在于两个指针:
一个是front(队首),指向队列的第一个元素;
另一个是rear(队尾),指向队列的最后一个元素的下一个位置。
在循环队列中,当rear指针到达数组的末尾时,它会跳回到数组的开头,形成一个循环。
python
class CircularQueue:
def __init__(self, capacity):
self.capacity = capacity + 1 # 多出的一个空间用来判断队列是否已满
self.queue = [None] * self.capacity
self.front = 0 # 队首指针
self.rear = 0 # 队尾指针
def is_full(self):
# 队列满的条件是队尾指针再前进一步就会和队首指针重合
return (self.rear + 1) % self.capacity == self.front
def is_empty(self):
# 队列空的条件是队首和队尾指针相等
return self.front == self.rear
def enqueue(self, item):
# 入队操作
if self.is_full():
raise Exception("Queue is full")
self.queue[self.rear] = item
self.rear = (self.rear + 1) % self.capacity # 循环移动
def dequeue(self):
# 出队操作
if self.is_empty():
raise Exception("Queue is empty")
item = self.queue[self.front]
self.queue[self.front] = None # 可选操作,清除引用
self.front = (self.front + 1) % self.capacity # 循环移动
return item
def peek(self):
# 查看队首元素
if self.is_empty():
raise Exception("Queue is empty")
return self.queue[self.front]
在这个实现中,使用了一个定长数组来存储队列元素,并通过模运算(% self.capacity)来确保指针在达到数组边界时能够循环移动到数组的开始位置。这样就实现了一个高效且节省空间的循环队列。