1- """ A Queue using a Linked List like structure """
2- from typing import Any , Optional
1+ """ A Queue using a linked list like structure """
2+ from typing import Any
33
44
55class Node :
6- def __init__ (self , data : Any , next : Optional ["Node" ] = None ):
7- self .data : Any = data
8- self .next : Optional ["Node" ] = next
6+ def __init__ (self , data : Any ) -> None :
7+ self .data = data
8+ self .next = None
9+
10+ def __str__ (self ) -> str :
11+ return f"{ self .data } "
912
1013
1114class LinkedQueue :
1215 """
13- Linked List Queue implementing put (to end of queue),
14- get (from front of queue) and is_empty
15-
1616 >>> queue = LinkedQueue()
1717 >>> queue.is_empty()
1818 True
@@ -35,40 +35,117 @@ class LinkedQueue:
3535 >>> queue.get()
3636 Traceback (most recent call last):
3737 ...
38- IndexError: get from empty queue
38+ IndexError: dequeue from empty queue
3939 """
4040
4141 def __init__ (self ) -> None :
42- self .front : Optional [Node ] = None
43- self .rear : Optional [Node ] = None
42+ self .front = self .rear = None
43+
44+ def __iter__ (self ):
45+ node = self .front
46+ while node :
47+ yield node .data
48+ node = node .next
49+
50+ def __len__ (self ) -> int :
51+ """
52+ >>> queue = LinkedQueue()
53+ >>> for i in range(1, 6):
54+ ... queue.put(i)
55+ >>> len(queue)
56+ 5
57+ >>> for i in range(1, 6):
58+ ... assert len(queue) == 6 - i
59+ ... _ = queue.get()
60+ >>> len(queue)
61+ 0
62+ """
63+ return len (tuple (iter (self )))
64+
65+ def __str__ (self ) -> str :
66+ """
67+ >>> queue = LinkedQueue()
68+ >>> for i in range(1, 4):
69+ ... queue.put(i)
70+ >>> queue.put("Python")
71+ >>> queue.put(3.14)
72+ >>> queue.put(True)
73+ >>> str(queue)
74+ '1 <- 2 <- 3 <- Python <- 3.14 <- True'
75+ """
76+ return " <- " .join (str (item ) for item in self )
4477
4578 def is_empty (self ) -> bool :
46- """ returns boolean describing if queue is empty """
47- return self .front is None
79+ """
80+ >>> queue = LinkedQueue()
81+ >>> queue.is_empty()
82+ True
83+ >>> for i in range(1, 6):
84+ ... queue.put(i)
85+ >>> queue.is_empty()
86+ False
87+ """
88+ return len (self ) == 0
4889
49- def put (self , item : Any ) -> None :
50- """ append item to rear of queue """
51- node : Node = Node (item )
90+ def put (self , item ) -> None :
91+ """
92+ >>> queue = LinkedQueue()
93+ >>> queue.get()
94+ Traceback (most recent call last):
95+ ...
96+ IndexError: dequeue from empty queue
97+ >>> for i in range(1, 6):
98+ ... queue.put(i)
99+ >>> str(queue)
100+ '1 <- 2 <- 3 <- 4 <- 5'
101+ """
102+ node = Node (item )
52103 if self .is_empty ():
53- # the queue contains just the single element
54- self .front = node
55- self .rear = node
104+ self .front = self .rear = node
56105 else :
57- # not empty, so we add it to the rear of the queue
58106 assert isinstance (self .rear , Node )
59107 self .rear .next = node
60108 self .rear = node
61109
62110 def get (self ) -> Any :
63- """ returns and removes item at front of queue """
111+ """
112+ >>> queue = LinkedQueue()
113+ >>> queue.get()
114+ Traceback (most recent call last):
115+ ...
116+ IndexError: dequeue from empty queue
117+ >>> queue = LinkedQueue()
118+ >>> for i in range(1, 6):
119+ ... queue.put(i)
120+ >>> for i in range(1, 6):
121+ ... assert queue.get() == i
122+ >>> len(queue)
123+ 0
124+ """
64125 if self .is_empty ():
65- raise IndexError ("get from empty queue" )
66- else :
67- # "remove" element by having front point to the next one
68- assert isinstance (self .front , Node )
69- node : Node = self .front
70- self .front = node .next
71- if self .front is None :
72- self .rear = None
73-
74- return node .data
126+ raise IndexError ("dequeue from empty queue" )
127+ assert isinstance (self .front , Node )
128+ node = self .front
129+ self .front = self .front .next
130+ if self .front is None :
131+ self .rear = None
132+ return node .data
133+
134+ def clear (self ) -> None :
135+ """
136+ >>> queue = LinkedQueue()
137+ >>> for i in range(1, 6):
138+ ... queue.put(i)
139+ >>> queue.clear()
140+ >>> len(queue)
141+ 0
142+ >>> str(queue)
143+ ''
144+ """
145+ self .front = self .rear = None
146+
147+
148+ if __name__ == "__main__" :
149+ from doctest import testmod
150+
151+ testmod ()
0 commit comments