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