# 根节点作为入口, 队列先进先出。 出队的地方是根结点的下一个结点. 入口是尾结点
class Node(object):
def __init__(self, value=None, next=None):
self.value = value
self.next = next
def __str__(self):
""" 方便打印调试。 """
return '<Node:value:{} , next={}>'.format(self.value, self.next)
__repr__ = __str__
class Queue(object):
def __init__(self, maxsize=50):
self.maxsize = maxsize
self.root = Node()
self.length = 0
self.tailnode = None
def __len__(self):
return self.length
def push(self, value):
if self.maxsize is not None and len(self) > self.maxsize:
raise Exception('队列已经满了')
node = Node(value)
if self.root.next is None:
self.root.next = node
self.tailnode = node
else:
self.tailnode.next = node
self.tailnode = node
self.length += 1
def iter_node(self):
curnode = self.root.next
while curnode is not self.tailnode:
yield curnode
curnode = curnode.next
yield curnode
def __iter__(self):
for node in self.iter_node():
yield node.value
def pop(self):
curnode = self.root.next
prevnode =self.root
prevnode.next = curnode.next
del curnode
self.length -= 1
def test_queue():
q = Queue()
q.push(1)
q.push(2)
q.push(3)
assert len(q) == 3
assert list(q) == [1,2,3]
q.pop()
assert list(q) == [2,3]