数据结构-循环队列(Python实现)

今天咱们来到了循环队列这一节,以前的文章中,我介绍过了用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
  • 定义len和print函数
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

你还了解哪些队列类型呢?留言告诉我吧。

相关文章
相关标签/搜索