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
3
3
4
4
5
5
class 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 } "
9
12
10
13
11
14
class LinkedQueue :
12
15
"""
13
- Linked List Queue implementing put (to end of queue),
14
- get (from front of queue) and is_empty
15
-
16
16
>>> queue = LinkedQueue()
17
17
>>> queue.is_empty()
18
18
True
@@ -35,40 +35,117 @@ class LinkedQueue:
35
35
>>> queue.get()
36
36
Traceback (most recent call last):
37
37
...
38
- IndexError: get from empty queue
38
+ IndexError: dequeue from empty queue
39
39
"""
40
40
41
41
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 )
44
77
45
78
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
48
89
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 )
52
103
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
56
105
else :
57
- # not empty, so we add it to the rear of the queue
58
106
assert isinstance (self .rear , Node )
59
107
self .rear .next = node
60
108
self .rear = node
61
109
62
110
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
+ """
64
125
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