#-*- coding: utf-8 -*-
from collections importdequeclassNode(object):def __init__(self, value=None, prev=None, next=None):
self.value, self.prev, self.next=value, prev, nextclassCircularDoubleLinkedList(object):def __init__(self, maxsize=None):
self.maxsize=maxsize
node=Node()
node.next, node.prev=node, node
self.root=node
self.length=0def __len__(self):returnself.lengthdefheadnode(self):returnself.root.nextdeftailnode(self):returnself.root.prevdefappend(self, value):if self.maxsize is not None and len(self) >=self.maxsize:raise Exception('LinkedList is Full')
node= Node(value=value)
tailnode= self.tailnode() orself.root
tailnode.next=node
node.prev=tailnode
node.next=self.root
self.root.prev=node
self.length+= 1
defappendleft(self, value):if self.maxsize is not None and len(self) >=self.maxsize:raise Exception('LinkedList is Full')
node= Node(value=value)if self.root.next is self.root: #empty
node.next =self.root
node.prev=self.root
self.root.next=node
self.root.prev=nodeelse:
node.prev=self.root
headnode=self.root.next
node.next=headnode
headnode.prev=node
self.root.next=node
self.length+= 1
defremove(self, node):if node isself.root:return
else: # node.prev.next =node.next
node.next.prev=node.prev
self.length-= 1
returnnodedefiter_node(self):if self.root.next isself.root:returncurnode=self.root.nextwhile curnode.next is notself.root:yieldcurnode
curnode=curnode.nextyieldcurnodedef __iter__(self):for node inself.iter_node():yieldnode.valuedefiter_node_reverse(self):if self.root.prev isself.root:returncurnode=self.root.prevwhile curnode.prev is notself.root:yieldcurnode
curnode=curnode.prevyieldcurnodeclassDeque(CircularDoubleLinkedList):defpop(self):"""删除尾节点"""
if len(self) ==0:raise Exception('empty')
tailnode=self.tailnode()
value=tailnode.value
self.remove(tailnode)returnvaluedefpopleft(self):if len(self) ==0:raise Exception('empty')
headnode=self.headnode()
value=headnode.value
self.remove(headnode)returnvaluedeftest_deque():
dq=Deque()
dq.append(1)
dq.append(2)assert list(dq) == [1, 2]
dq.appendleft(0)assert list(dq) == [0, 1, 2]
dq.pop()assert list(dq) == [0, 1]
dq.popleft()assert list(dq) == [1]
dq.pop()assert len(dq) ==0classStack(object):def __init__(self):
self.deque=Deque()defpush(self, value):
self.deque.append(value)defpop(self):returnself.deque.pop()classStack2(object):def __init__(self):
self._deque=deque()defpush(self, value):returnself._deque.append(value)defpop(self):returnself._deque.pop()defempty(self):return len(self._deque) ==0deftest_stack():
s=Stack()
s.push(0)
s.push(1)
s.push(2)assert s.pop() == 2
assert s.pop() == 1
assert s.pop() ==0import pytest #pip install pytest
with pytest.raises(Exception) as excinfo:
s.pop()assert 'empty' instr(excinfo.value)if __name__ == '__main__':
test_stack()