队列: 是一种受限的线性数据结构,先进先出,尾端插入头端出列
顺序队列
数组实现的队列: 1.在出队的时候整个队列的数据都往头迁移,这样的话时间复杂度就是O(n),入队的时间复杂度为O(1) 2.出队的时候直接从队头弹出一个数据,然后头指针往后迁移一步,这中出队操作的时间复杂度是O(1),但是入队就需要判定下是否队列满了,假如满了但是头指针在队头就扩充,假如头指针在队尾就做数据迁移
但是这两点在python上都体现不出来,因为list是动态数组
class Queue:
def __init__(self):
self.items = list()
self.n = 0
self.head = 0
def enqueue(self,item):
self.items.append(item)
def dequeue(self):
tmp = self.items[self.head]
self.items.remove(self.head)
self.head += 1
return tmp
链式队列
加个tail的尾引用,出队操作,直接拿head.next作为新的head,入队则是 把新结点插入到尾结点的next,再把新结点作为尾结点
class Node:
def __init__(self,value):
self.value = value
self.next = None
class LinkQueue:
def __init__(self):
self.head = None
self.n = 0
self.tail = None
def enqueue(self,value):
new_node = Node(value)
if self.head == None :
self.head = new_node
self.tail = self.head
else :
self.tail.next = new_node
self.tail = new_node
self.n += 1
def dequeue(self):
if self.n == 0 : return False
value = self.head.value
self.head = self.head.next
self.n -= 1
return value
还有一种循环队列,可以解决队列的数据迁移问题,使得用数组实现的队列入队和出队操作时间复杂度都为o(1)