美文网首页
Python数据结构-Queue(队列)

Python数据结构-Queue(队列)

作者: AndZONE | 来源:发表于2018-12-12 10:33 被阅读14次

    队列(queue),是先进先出(FIFO, First-In-First-Out)的线性表,在具体应用中通常用链表或者数组来实现,队列只允许在后端(称为 rear )进行插入操作,在前端(称为 front )进行删除操作,队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。来自维基百科

    1484793256.png

    抽象数据描述如下:

    ADT Queue:
            Queue(self)         # 创建空队列
        is_empty(self)      # 判断队列是否为空
        enqueue(self, elem) # 将元素elem加入队列
        dequeue(self)       # 删除队列中最先加入的元素并将其返回
        peek(self)          # 取得队列中最早进入的元素,不删除
    

    由于通过顺序表来实现队列存在假性溢出或者O(n)操作,所以这里实现通过循环表实现:

    # -*- coding: UTF-8 -*- 
    
    
    class QueueUnderflow(ValueError):
        pass
    
    
    # 循环顺序表实现队列,头部删除和查看O(1),尾部加入O(1)
    class SQueue(object):
        def __init__(self, init_num=8):
            self._len = init_num    # 存储区长度
            self._elems = [0] * init_num
            self._head = 0          # 表头元素下标
            self._num = 0           # 元素个数
    
        def is_empty(self):
            return self._num == 0
    
        def peek(self):
            if self.is_empty():
                raise QueueUnderflow
            return self._elems[self._head]
    
        def dequeue(self):
            if self.is_empty():
                raise QueueUnderflow
            result = self._elems[self._head]
            self._head = (self._head + 1) % self._len
            self._num -= 1
            return result
    
        def enqueue(self, elem):
            if self._num == self._len:
                self.__extand()
            self._elems[(self._head + self._num) % self._len] = elem
            self._num += 1
    
        def __extand(self):     # 当入队的时候如果 list长度不够,动态增加2倍
            old_len = self._len
            self._len *= 2
            new_elems = [0] * self._len
            for i in range(old_len):
                new_elems[i] = self._elems[(self._head + i) % old_len]
            self._elems, self._head = new_elems, 0
    
    
    if __name__ == "__main__":
        q = SQueue()
        for i in range(8):
            q.enqueue(i)
        # for i in range(8):
        #    print(q.dequeue())
        # print(q._num)
        q.enqueue(3)
        print(q._num)
    
    

    相关文章

      网友评论

          本文标题:Python数据结构-Queue(队列)

          本文链接:https://www.haomeiwen.com/subject/rnruhqtx.html