队列
队列是由一系列对象组成的集合,这些对象的插入和删除遵循先进先出的原则。也就是说,元素可以在任何时刻进行插入,但只有处在队列最前面的元素才能被删除 通常将队列允许插入的一端称为队尾,将允许删除的一端则称为队头
队列的抽象数据类型
Q为队列的一个实例
Q.enqueue(e):向队列Q的队尾添加一个元素
Q.dequeue():从队列Q中移除并返回第一个元素,如果队列为空,则触发一个错误
Q.first():在不移除的前提下返回队列中的第一个元素;如果队列为空,则触发一个错误
Q.is_empty():如果队列Q没有包含任何元素则返回布尔值True
len(Q):返回队列Q中元素的数量
基于数组的队列实现
_data:指一个固定容量的列表实例
_size :是一个整数,代表当前存储在队列内的元素的数量
_front:是一个整数,代表_data实例队列中第一个元素的索引
class Empty(Exception):
pass #占位语句
class ArrayQueue:
DEFAULT_CAPACITY=10
def __init__(self):
self._data=[None]*ArrayQueue.DEFAULT_CAPACITY
self._size=0
self._front=0
def __len__(self):
return self._size
def is_empty(self):
return self._size==0
def first(self):
if self.is_empty():
raise Empty('Queue is empty')
return self._data[self._front]
def dequeue(self):
if self.is_empty():
raise Empty('Queue is empty')
answer=self.data[self._front]
self.data[self._front]=None
self._front=(self._front+1)%len(self._data)
self._size=self._size-1
return answer
def enqueue(self,e):
if self._size==len(self._data):
self._resize(2*len(self._data))
avail=(self._front+self._size)%len(self._data)
self._data[avail]=e
self._size+=1
def _resize(self,cap):
old=self._data
self._data=[None]*cap
walk=self._front
for k in range(self._size):
self._data[k]=old[walk]
walk=(1+walk)%len(old)
self._front=0