队列(queue)
只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出(First In First Out)的线性表,简称FIFO。 允许插入的一端称为队尾,允许删除的一端称为队头。
如何用单链表来实现队列?
push in Queue= append in Linked List?
假设我们有三个元素1,2,3,依次排进队列。单链表中的append可以实现相当于队列里面push的功能,最后这个队列将会是【1,2,3】
pop in Queue= popleft in Linked List?
在队列的pop操作时,我们想要的是First In First Out,第一个被pop出来的应该是1,因为1是第一个进入队列的。这等同于单链表里的popleft功能。
这里我们需用到之前的文章http://www.sophiesu.space/?p=87里面的代码。 我们需要把上面这篇文章里的代码存到Python当前的的working directory, 命名为为Linked_List.py。然后在当前程序中,用import来导入LinkedList方法。
from Linked_List import LinkedList def FullError(Exception): pass def EmptyError(Exception): pass class Queue(object): def __init__(self,maxsize=None): self.maxsize=maxsize 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 FullError("Full") return self._item_linked_list.append(value) def pop(self,value): if self.maxsize is not None and len(self)>=self.maxsize: raise EmptyError("Empty") return self._item_linked_list.popleft(value) 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 import pytest with pytest.raises(EmptyError) as excinfo: q.pop() assert "Empty"==str(excinfo.value)