6. 队列(1)

  1. 队列

队列和常说的排队差不多,先来的人先走,后面来的人接着走,最后来的人最后走

image.png

结构:FIFO

栈和队列是相反的,先进后出,后进先出的结构

队列不是凭空实现的一个结构,还要用之前已经实现过的数据结构来实现


之前学习的结构:

    array,list,linkedlist,dll


2. 实现队列的ADT需要有两个基本操作:

push(入队)

pop(出队)

用列表实现:

比如说他是一个固定的列表,向前插入元素的话,这样它的时间复杂度比较高,因为他要把后面入队的元素往列表后面移动,方便出队,所以选择列表不合适。

image.png


用单链表实现:

入队实际上等于往root节点后面插入O(n),出队实际上是把最后一个节点删除,效率不高

image.png


之前实现过单链表,包含append和remove操作等等,这里选用单链表实现队列的话,会发现有一个popleft方法和append方法,这里两个方法的时间复杂度都是O(1),这样就能方面的用单链表实现队列了。

image.png



用双链表实现:

也同样支持这两个方法操作实现的,但是双链表更复杂,所以这里用单链表来实现队列。



代码实现:

class Queue(object):
    def __init__(self, maxsize=None):
        self.maxsize = maxsize                      #默认为空,可以push元素到里面
        self._item_linked_list = LinkedList()       #实例化之前的构造的单链表

    def __len__(self):
        return len(self._item_linked_list)

    def push(self, value):                          #入队
        if self.maxsize is not None \
            and len(self) >= self.maxsize:          #判断链表满了的情况
            raise Exception('Queue is Full')
        return self._item_linked_list.append(value) #否则添加元素

    def pop(self):
        if len(self) <= 0:
            raise Exception('Queue is empty')
        return self._item_linked_list.popleft()


#单元测试
def test_queue():
    q = Queue()
    q.push(0)
    q.push(1)
    q.push(2)
    assert len(q) == 3
    assert q.pop() == 0
    assert q.pop() == 1
    assert q.pop() == 2


使用when-Changed的命令监控测试:

安装使用说明:https://pypi.org/project/when-changed/0.2.1/#description


# when-changed -v -r -1 -S ./  'py.test -s queue.py'

这样就能动态监测代码执行了。

猜你喜欢

转载自blog.51cto.com/286577399/2150642
今日推荐