Ch3 Queue 队列 – Python 数据结构与算法 学习笔记

队列(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)
    
Previous post 前一篇 Ch2.4.8 Transfer Learning – MACHINE LEARNING WITH TENSORFLOW 学习笔记
Next post 下一篇 Ch2 Circular Double Linked List 循环双向链表 – Python 数据结构与算法 学习笔记
image/svg+xml

Menu 菜单

Follow me 关注我

Stay updated

Subscribe to my newsletter to receive my latest work.

订阅我的电子报,可以收到我的最新作品。