顺序队列实现先进先出的原则。front指向队首元素,rear指向队尾元素的下一个存储位置。
关于顺序队列,会产生假溢出的情形,例如一个有6个存储空间的队列存满,出队2次以后,仍无法在第7个存储空间继续入队,但实际上此队列在前方仍然有两个空余的存储空间。
解决这个问题,最好的方法是将顺序队列–》逻辑上首位相连的循环队列,转换可以用front=(rear+1)%size实现。但是循环队列有一个问题,就是如何区分队空和队满的状态。选择少用一个存储单元的方法,即队空的条件是front=rear,队满的条件是front=(rear+1)%size
class MyCircularQueue:
def __init__(self,k:int):
'''
Initialize your data structure here.Set the size of the queue to be k.
'''
self.front = 0
self.rear = 0
self.capacity = k+1
self.arr=[0 for _ in range(self.capacity)]
def enQueue(self,value):
if self.isFull():
return False
self.arr[slef.rear]=value
self.rear=(self.rear+1)%self.capacity
return True
def deQueue(self):
if self.isEmpty():
return False
self.front=(self.front+1)%self.capacity
return True
def Front(self):
if self.isEmpty():
return -1
return self.arr[self.front]
def Rear(self):
if self.isEmpty():
return -1
return self.arr[(self.rear-1)%self.capacity]#rear代表的末尾元素的下一个;所以找值就self.rear-1,找位置就是rear
def isEmpty(self):
return self.front==self.rear
def isFull(self):
return self.front==(self.rear+1)%self.capacity
时间复杂度为O(1),该结构中,所有的方法都具有恒定的时间复杂度;
空间复杂度为O(N),循环队列的整个生命周期里,都持有该预分配的空间。