美文网首页
python-034-实现队列-使用链表

python-034-实现队列-使用链表

作者: DKider | 来源:发表于2019-04-25 22:13 被阅读0次

对于队列的介绍在之前的文章一节写过了——https://www.jianshu.com/p/41dc9265109a
这篇我是用的python内置的列表,是使用适配器设计模式,实现了我们的队列结构。
缺点就是我们需要不断地更新底层数组的大小,这会让某次操作的时间复杂度上升。虽然我们利用边界摊销,可以将平均下来的操作视为O(1)。

今天我们用链表来实现队列,让每一个操作真正的达到O(1)。

链表动态的增删,代替了之前改变数组大小的操作,但是值得注意的是,链表在删除尾结点的操作上,并不高效,因为他需要遍历链表拿到倒数第二个节点。
更通俗的说法:如果只给定尾结点的引用 ,我们很难有效地删除该节点。因为我们没法拿到他的前驱节点的引用。

根据队列先进先出的特点,它只能在队尾添加元素,在队头删除元素,所以我们把链表容易删除的一端——链表头作为队头,把链表尾作为队尾,为了我们添加元素方便,我们还需要维护一个_tail引用来指向链表尾元素,这样我们在添加一个新的元素的时候,就不用遍历链表来拿到尾结点的引用了。

这次的实现与昨大前天的实现栈——https://www.jianshu.com/p/fe9c422db4de很像。

在实现的时候需要注意的一点是,当执行出队列的操作,而队列中只有一个元素的时候,我们在将最后一个元素出队列后,我们需要把_tail的引用改为None,因为此时的tail是指向最后一个元素,我们把头节点后移后,尾结点的引用还是在的,这样可以利于python进行垃圾回收。

源代码:

class Empty(Exception):
    pass


class LinkedQueue:
    class _Node:
        def __init__(self, element, next):
            self._element = element
            self._next = next

    def __init__(self):
        self._head = None
        self._tail = None
        self._size = 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._head._element

    def enqueue(self, e):
        newest = self._Node(e, None)
        if self.is_empty():
            self._head = newest
        else:
            self._tail._next = newest
        self._tail = newest
        self._size += 1

    def dequeue(self):
        if self.is_empty():
            raise Empty("Queue is empty!")
        answer = self._head
        self._head = self._head._next
        self._size -= 1
        if self.is_empty():
            self._tail = None
        return answer

这次与上次一样没有实现str方法,当然遍历链表也可以实现查看队列的内容,但是我觉得数据结构应该具有封装性,用户不应该访问数据结构的内部情况。

相关文章

  • python-034-实现队列-使用链表

    对于队列的介绍在之前的文章一节写过了——https://www.jianshu.com/p/41dc9265109...

  • 2017.5.25

    lua学习总结:数据结构: 使用Lua实现链表(单向链表和双向链表),队列 使用Lua保存图,用table保存,每...

  • 数据结构【动态队列】代码实现

    队列是使用链表实现,包含队列的初始化、入队、出队、输出队列内容、判断队列内容是否为空

  • C语言实现链式队列

    链式队列,简称"链队列",即使用链表实现的队列存储结构。链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为...

  • 数据结构java描述

    接口 栈 队列 集合 并查集 映射 数组 链表 栈 数组实现 链表实现 队列 数组实现 链表实现 二分搜索树 集合...

  • JUC并发集合总结

    ConcurrentLinkedQueue 线程安全的支持高并发的队列,使用链表实现。非阻塞,无锁,无界。该队列也...

  • Java集合系列之LinkedList源码分析

    前言 LinkedList是基于双向链表实现的,除了可以当链表来操作,它还可以当做栈,队列以及双端队列来使用,且是...

  • Java

    这篇博客主要讲解的是如何使用单链表实现一个简单版的队列。单向链表队列是属于非循环队列,同时队列的长度是不受限制的,...

  • 队列

    基于数组的循环队列 Java实现 基于链表的队列实现 Java实现

  • (二) python实现数据结构之队列(queue)篇

    一.队列类型介绍 python代码实现 (1).数组的方式实现队列 (2).链表的方式实现队列

网友评论

      本文标题:python-034-实现队列-使用链表

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