队列的存储结构中使用的最多的是循环队列。循环队列包括两个指针, front 指针指向队头元素, rear 指针指向队尾元素的下一个位置。
队列为空的判断条件是:
front == rear
队列满的判断条件是
(rear+1)%maxsize == front
队列长度的计算公式:
(rear-front+maxsize)%maxsize
正常情况下当front == rear是队列有可能是满也有可能是空,为了区分这两种情况 我们需要在front前添加一个闲置单元。
示例
class MyCircularQueue:
def __init__(self, k):
"""
Initialize your data structure here. Set the size of the queue to be k.
:type k: int
"""
self.queue = [None] * (k + 1)
self.maxsize = (k + 1)
self.front = 0
self.rear = 0
def enQueue(self, value):
"""
Insert an element into the circular queue. Return true if the operation is successful.
:type value: int
:rtype: bool
"""
if self.isFull():
return False
self.queue[self.rear] = value
self.rear = (self.rear + 1) % self.maxsize
return True
def deQueue(self):
"""
Delete an element from the circular queue. Return true if the operation is successful.
:rtype: bool
"""
if self.isEmpty():
return False
self.queue[self.front] = None
self.front = (self.front + 1) % self.maxsize
return True
def Front(self):
"""
Get the front item from the queue.
:rtype: int
"""
if self.isEmpty():
return -1
return self.front
def Rear(self):
"""
Get the last item from the queue.
:rtype: int
"""
if self.isEmpty():
return -1
return self.rear
def isEmpty(self):
"""
Checks whether the circular queue is empty or not.
:rtype: bool
"""
return self.front == self.rear
def isFull(self):
"""
Checks whether the circular queue is full or not.
:rtype: bool
"""
return (self.rear + 1) % self.maxsize == self.front