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