6. 队列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6. 队列相关的知识,希望对你有一定的参考价值。
队列
队列和常说的排队差不多,先来的人先走,后面来的人接着走,最后来的人最后走
结构: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. 队列的主要内容,如果未能解决你的问题,请参考以下文章