1+ class Node (object ):
2+ def __init__ (self , value = None , next = None , previous = None ):
3+ self .value , self .next , self .previous = value , next , previous
4+
5+
6+ class CircularDoubleLinkedNode (object ):
7+ def __init__ (self , maxsize = None ):
8+ self .maxsize = maxsize
9+ self .root = Node ()
10+ self .root .next = self .root
11+ self .root .previous = self .root
12+ self .length = 0
13+
14+ def __len__ (self ):
15+ return self .length
16+
17+ def headnode (self ):
18+ return self .root .next
19+
20+ def tailnode (self ):
21+ return self .root .previous
22+
23+ def append (self , value ):
24+ if self .maxsize is not None and self .value >= self .maxsize :
25+ raise Exception ('Full' )
26+ node = Node (value )
27+ tailnode = self .tailnode ()
28+ tailnode .next = node
29+ node .next = self .root
30+ node .previous = tailnode
31+ self .length += 1
32+ self .root .previous = node
33+
34+ def appendleft (self , value ):
35+ if self .maxsize is not None and self .value >= self .maxsize :
36+ raise Exception ('Full' )
37+ node = Node (value )
38+ headnode = self .headnode ()
39+ self .root .next = node
40+ node .next = headnode
41+ headnode .previous = node
42+ node .previous = self .root
43+ self .length += 1
44+
45+ def pop (self ):
46+ if self .root .next is self .root :
47+ return
48+ tailnode = self .tailnode ()
49+ prevnode = tailnode .previous
50+ prevnode .next = self .root
51+ self .root .previous = prevnode
52+ value = tailnode .value
53+ del tailnode
54+ self .length -= 1
55+ return value
56+
57+ def popleft (self ):
58+ if self .root .next is self .root :
59+ return
60+ headnode = self .headnode ()
61+ self .root .next = headnode .next
62+ headnode .next .previous = self .root
63+ value = headnode .value
64+ del headnode
65+ self .length -= 1
66+ return value
67+
68+ def __iter__ (self ):
69+ for node in self ._iter_node ():
70+ yield node .value
71+
72+ def _iter_node (self ):
73+ curnode = self .root .next
74+ while curnode is not self .root :
75+ yield curnode
76+ curnode = curnode .next
77+
78+ def remove (self , node ):
79+ if self .root .next is self .root :
80+ raise Exception ('remove empty CircularDoubleLinkedNode' )
81+ prevnode = node .previous
82+ nextnode = node .next
83+ prevnode .next = nextnode
84+ nextnode .previous = prevnode
85+ del node
86+ self .length -= 1
87+
88+ def reverse_node (self ):
89+ curnode = self .root .previous
90+ while curnode is not self .root :
91+ yield curnode
92+ curnode = curnode .previous
93+
94+
95+ class Queue (object ):
96+ def __init__ (self ):
97+ self ._items = CircularDoubleLinkedNode ()
98+
99+ def __len__ (self ):
100+ return len (self ._items )
101+
102+ def __iter__ (self ):
103+ for item in self ._items :
104+ yield item
105+
106+ def push (self , value ):
107+ self ._items .append (value )
108+
109+ def pop (self ):
110+ return self ._items .popleft ()
111+
112+ def is_empty (self ):
113+ return len (self ._items ) == 0
114+
115+
116+ def test ():
117+ q = Queue ()
118+ for i in range (5 ):
119+ q .push (i )
120+ assert list (q ) == [i for i in range (5 )]
121+ assert len (q ) == 5
122+ for i in range (5 ):
123+ assert q .pop () == i
124+ assert len (q ) == 0
125+
126+
127+ if __name__ == "__main__" :
128+ test ()
0 commit comments