队列python
队列和常说的排队差很少,先来的人先走,后面来的人接着走,最后来的人最后走数据结构
结构:FIFO
app
栈和队列是相反的,先进后出,后进先出的结构ide
队列不是凭空实现的一个结构,还要用以前已经实现过的数据结构来实现单元测试
以前学习的结构:学习
array,list,linkedlist,dll测试
2. 实现队列的ADT须要有两个基本操做:spa
push(入队)blog
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'
这样就能动态监测代码执行了。