码迷,mamicode.com
首页 > 其他好文 > 详细

6. 队列(1)

时间:2018-07-26 18:24:04      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:单元测试   queue   需要   def   栈和队列   cep   als   ini   链表实现   

  • 队列

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

    技术分享图片

    结构:FIFO

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

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


    之前学习的结构:

        array,list,linkedlist,dll


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

    push(入队)

    pop(出队)

    用列表实现:

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

    技术分享图片


    用单链表实现:

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

    技术分享图片


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

    技术分享图片



    用双链表实现:

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



    代码实现:

    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'

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

    6. 队列(1)

    标签:单元测试   queue   需要   def   栈和队列   cep   als   ini   链表实现   

    原文地址:http://blog.51cto.com/286577399/2150642

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!