今天咱们来到了循环队列这一节,以前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法。html
可是,咱们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不同的,删除列表的第一个元素,那么在它以后的全部元素都要进行移动。因此当列表特别长的时候,这个代价就比较明显了。咱们本文介绍的循环队列能够避免这个问题,一样咱们上篇文章提到的用链表实现的方法也能够避免。python
下面,咱们来介绍循环队列。函数
循环队列,就是将普通的队列首尾链接起来, 造成一个环状,并分别设置首尾指针,用来指明队列的头和尾。每当咱们插入一个元素,尾指针就向后移动一位,固然,在这里咱们队列的最大长度是提早定义好的,当咱们弹出一个元素,头指针就向后移动一位。oop
这样,列表中就不存在删除操做,只有修改操做,从而避免了删除前面节点形成的代价大的问题。指针
好,话很少说,咱们用代码来实现一下code
class Loopqueue: def __init__(self, length): self.head = 0 self.tail = 0 self.maxSize = length self.cnt = 0 self.__list = [None]*length
这里一样,咱们定义一个队列类,在实例化循环队列的时候,要求指定队列的大小,除了首尾指针以及队列最大长度以外,咱们还声明一个表示队列当前长度的属性cnt。htm
接下来咱们给队列增长一些操做:blog
def isEmpty(self): return self.cnt == 0
def isFull(self): return self.cnt == self.maxSize
def push(self, data): if self.isFull(): return False if self.isEmpty(): self.__list[0] = data self.head = 0 self.tail = 0 self.cnt = 1 return True self.tail = (self.tail+1)%self.maxSize self.cnt += 1 self.__list[self.tail] = data return True
def pop(self): if self.isEmpty(): return False data = self.__list[self.head] self.head = (self.head+1)%self.maxSize self.cnt -= 1 return data
def clear(self): self.head = 0 self.tail = 0 self.cnt = 0 return True
def __len__(self): return self.cnt def __str__(self): s = '' for i in range(self.cnt): index = (i + self.head) % self.maxSize s += str(self.__list[index])+' ' return s
OK,咱们的循环队列类就定义好了,若是你看过介绍队列的文章,就会发现循环队列和普通队列的操做在逻辑上仍是有一些类似的。队列
代码并不难,相信你已经彻底理解了,本身动手操做一下吧。get
你还了解哪些队列类型呢?留言告诉我吧。