11"""
22Implementation of double ended queue.
33"""
4+ from __future__ import annotations
5+
46from dataclasses import dataclass
57from typing import Any , Iterable
68
79
810class Deque :
911 """
1012 Deque data structure.
11-
1213 Operations
1314 ----------
1415 append(val: Any) -> None
15-
1616 appendleft(val: Any) -> None
17-
1817 extend(iter: Iterable) -> None
19-
2018 extendleft(iter: Iterable) -> None
21-
2219 pop() -> Any
23-
2420 popleft() -> Any
25-
26-
2721 Observers
2822 ---------
2923 is_empty() -> bool
30-
31-
3224 Attributes
3325 ----------
3426 _front: _Node
3527 front of the deque a.k.a. the first element
36-
3728 _back: _Node
3829 back of the element a.k.a. the last element
39-
4030 _len: int
4131 the number of nodes
4232 """
@@ -51,13 +41,12 @@ class _Node:
5141 """
5242
5343 val : Any = None
54- next : " Deque._Node" = None
55- prev : " Deque._Node" = None
44+ next : Deque ._Node | None = None
45+ prev : Deque ._Node | None = None
5646
5747 class _Iterator :
5848 """
5949 Helper class for iteration. Will be used to implement iteration.
60-
6150 Attributes
6251 ----------
6352 _cur: _Node
@@ -66,10 +55,10 @@ class _Iterator:
6655
6756 __slots__ = ["_cur" ]
6857
69- def __init__ (self , cur : " Deque._Node" ) -> None :
58+ def __init__ (self , cur : Deque ._Node | None ) -> None :
7059 self ._cur = cur
7160
72- def __iter__ (self ) -> " Deque._Iterator" :
61+ def __iter__ (self ) -> Deque ._Iterator :
7362 """
7463 >>> our_deque = Deque([1, 2, 3])
7564 >>> iterator = iter(our_deque)
@@ -95,9 +84,10 @@ def __next__(self) -> Any:
9584
9685 return val
9786
98- def __init__ (self , iterable : Iterable = None ) -> None :
99- self ._front = self ._back = None
100- self ._len = 0
87+ def __init__ (self , iterable : Iterable [Any ] | None = None ) -> None :
88+ self ._front : Any = None
89+ self ._back : Any = None
90+ self ._len : int = 0
10191
10292 if iterable is not None :
10393 # append every value to the deque
@@ -108,7 +98,6 @@ def append(self, val: Any) -> None:
10898 """
10999 Adds val to the end of the deque.
110100 Time complexity: O(1)
111-
112101 >>> our_deque_1 = Deque([1, 2, 3])
113102 >>> our_deque_1.append(4)
114103 >>> our_deque_1
@@ -117,7 +106,6 @@ def append(self, val: Any) -> None:
117106 >>> our_deque_2.append('c')
118107 >>> our_deque_2
119108 ['a', 'b', 'c']
120-
121109 >>> from collections import deque
122110 >>> deque_collections_1 = deque([1, 2, 3])
123111 >>> deque_collections_1.append(4)
@@ -127,7 +115,6 @@ def append(self, val: Any) -> None:
127115 >>> deque_collections_2.append('c')
128116 >>> deque_collections_2
129117 deque(['a', 'b', 'c'])
130-
131118 >>> list(our_deque_1) == list(deque_collections_1)
132119 True
133120 >>> list(our_deque_2) == list(deque_collections_2)
@@ -153,7 +140,6 @@ def appendleft(self, val: Any) -> None:
153140 """
154141 Adds val to the beginning of the deque.
155142 Time complexity: O(1)
156-
157143 >>> our_deque_1 = Deque([2, 3])
158144 >>> our_deque_1.appendleft(1)
159145 >>> our_deque_1
@@ -162,7 +148,6 @@ def appendleft(self, val: Any) -> None:
162148 >>> our_deque_2.appendleft('a')
163149 >>> our_deque_2
164150 ['a', 'b', 'c']
165-
166151 >>> from collections import deque
167152 >>> deque_collections_1 = deque([2, 3])
168153 >>> deque_collections_1.appendleft(1)
@@ -172,7 +157,6 @@ def appendleft(self, val: Any) -> None:
172157 >>> deque_collections_2.appendleft('a')
173158 >>> deque_collections_2
174159 deque(['a', 'b', 'c'])
175-
176160 >>> list(our_deque_1) == list(deque_collections_1)
177161 True
178162 >>> list(our_deque_2) == list(deque_collections_2)
@@ -194,11 +178,10 @@ def appendleft(self, val: Any) -> None:
194178 # make sure there were no errors
195179 assert not self .is_empty (), "Error on appending value."
196180
197- def extend (self , iter : Iterable ) -> None :
181+ def extend (self , iter : Iterable [ Any ] ) -> None :
198182 """
199183 Appends every value of iter to the end of the deque.
200184 Time complexity: O(n)
201-
202185 >>> our_deque_1 = Deque([1, 2, 3])
203186 >>> our_deque_1.extend([4, 5])
204187 >>> our_deque_1
@@ -207,7 +190,6 @@ def extend(self, iter: Iterable) -> None:
207190 >>> our_deque_2.extend('cd')
208191 >>> our_deque_2
209192 ['a', 'b', 'c', 'd']
210-
211193 >>> from collections import deque
212194 >>> deque_collections_1 = deque([1, 2, 3])
213195 >>> deque_collections_1.extend([4, 5])
@@ -217,7 +199,6 @@ def extend(self, iter: Iterable) -> None:
217199 >>> deque_collections_2.extend('cd')
218200 >>> deque_collections_2
219201 deque(['a', 'b', 'c', 'd'])
220-
221202 >>> list(our_deque_1) == list(deque_collections_1)
222203 True
223204 >>> list(our_deque_2) == list(deque_collections_2)
@@ -226,11 +207,10 @@ def extend(self, iter: Iterable) -> None:
226207 for val in iter :
227208 self .append (val )
228209
229- def extendleft (self , iter : Iterable ) -> None :
210+ def extendleft (self , iter : Iterable [ Any ] ) -> None :
230211 """
231212 Appends every value of iter to the beginning of the deque.
232213 Time complexity: O(n)
233-
234214 >>> our_deque_1 = Deque([1, 2, 3])
235215 >>> our_deque_1.extendleft([0, -1])
236216 >>> our_deque_1
@@ -239,7 +219,6 @@ def extendleft(self, iter: Iterable) -> None:
239219 >>> our_deque_2.extendleft('ba')
240220 >>> our_deque_2
241221 ['a', 'b', 'c', 'd']
242-
243222 >>> from collections import deque
244223 >>> deque_collections_1 = deque([1, 2, 3])
245224 >>> deque_collections_1.extendleft([0, -1])
@@ -249,7 +228,6 @@ def extendleft(self, iter: Iterable) -> None:
249228 >>> deque_collections_2.extendleft('ba')
250229 >>> deque_collections_2
251230 deque(['a', 'b', 'c', 'd'])
252-
253231 >>> list(our_deque_1) == list(deque_collections_1)
254232 True
255233 >>> list(our_deque_2) == list(deque_collections_2)
@@ -262,24 +240,20 @@ def pop(self) -> Any:
262240 """
263241 Removes the last element of the deque and returns it.
264242 Time complexity: O(1)
265-
266243 @returns topop.val: the value of the node to pop.
267-
268244 >>> our_deque = Deque([1, 2, 3, 15182])
269245 >>> our_popped = our_deque.pop()
270246 >>> our_popped
271247 15182
272248 >>> our_deque
273249 [1, 2, 3]
274-
275250 >>> from collections import deque
276251 >>> deque_collections = deque([1, 2, 3, 15182])
277252 >>> collections_popped = deque_collections.pop()
278253 >>> collections_popped
279254 15182
280255 >>> deque_collections
281256 deque([1, 2, 3])
282-
283257 >>> list(our_deque) == list(deque_collections)
284258 True
285259 >>> our_popped == collections_popped
@@ -302,24 +276,20 @@ def popleft(self) -> Any:
302276 """
303277 Removes the first element of the deque and returns it.
304278 Time complexity: O(1)
305-
306279 @returns topop.val: the value of the node to pop.
307-
308280 >>> our_deque = Deque([15182, 1, 2, 3])
309281 >>> our_popped = our_deque.popleft()
310282 >>> our_popped
311283 15182
312284 >>> our_deque
313285 [1, 2, 3]
314-
315286 >>> from collections import deque
316287 >>> deque_collections = deque([15182, 1, 2, 3])
317288 >>> collections_popped = deque_collections.popleft()
318289 >>> collections_popped
319290 15182
320291 >>> deque_collections
321292 deque([1, 2, 3])
322-
323293 >>> list(our_deque) == list(deque_collections)
324294 True
325295 >>> our_popped == collections_popped
@@ -340,14 +310,12 @@ def is_empty(self) -> bool:
340310 """
341311 Checks if the deque is empty.
342312 Time complexity: O(1)
343-
344313 >>> our_deque = Deque([1, 2, 3])
345314 >>> our_deque.is_empty()
346315 False
347316 >>> our_empty_deque = Deque()
348317 >>> our_empty_deque.is_empty()
349318 True
350-
351319 >>> from collections import deque
352320 >>> empty_deque_collections = deque()
353321 >>> list(our_empty_deque) == list(empty_deque_collections)
@@ -359,14 +327,12 @@ def __len__(self) -> int:
359327 """
360328 Implements len() function. Returns the length of the deque.
361329 Time complexity: O(1)
362-
363330 >>> our_deque = Deque([1, 2, 3])
364331 >>> len(our_deque)
365332 3
366333 >>> our_empty_deque = Deque()
367334 >>> len(our_empty_deque)
368335 0
369-
370336 >>> from collections import deque
371337 >>> deque_collections = deque([1, 2, 3])
372338 >>> len(deque_collections)
@@ -379,19 +345,17 @@ def __len__(self) -> int:
379345 """
380346 return self ._len
381347
382- def __eq__ (self , other : "Deque" ) -> bool :
348+ def __eq__ (self , other : object ) -> bool :
383349 """
384350 Implements "==" operator. Returns if *self* is equal to *other*.
385351 Time complexity: O(n)
386-
387352 >>> our_deque_1 = Deque([1, 2, 3])
388353 >>> our_deque_2 = Deque([1, 2, 3])
389354 >>> our_deque_1 == our_deque_2
390355 True
391356 >>> our_deque_3 = Deque([1, 2])
392357 >>> our_deque_1 == our_deque_3
393358 False
394-
395359 >>> from collections import deque
396360 >>> deque_collections_1 = deque([1, 2, 3])
397361 >>> deque_collections_2 = deque([1, 2, 3])
@@ -400,12 +364,15 @@ def __eq__(self, other: "Deque") -> bool:
400364 >>> deque_collections_3 = deque([1, 2])
401365 >>> deque_collections_1 == deque_collections_3
402366 False
403-
404367 >>> (our_deque_1 == our_deque_2) == (deque_collections_1 == deque_collections_2)
405368 True
406369 >>> (our_deque_1 == our_deque_3) == (deque_collections_1 == deque_collections_3)
407370 True
408371 """
372+
373+ if not isinstance (other , Deque ):
374+ return NotImplemented
375+
409376 me = self ._front
410377 oth = other ._front
411378
@@ -422,18 +389,16 @@ def __eq__(self, other: "Deque") -> bool:
422389
423390 return True
424391
425- def __iter__ (self ) -> " _Iterator" :
392+ def __iter__ (self ) -> Deque . _Iterator :
426393 """
427394 Implements iteration.
428395 Time complexity: O(1)
429-
430396 >>> our_deque = Deque([1, 2, 3])
431397 >>> for v in our_deque:
432398 ... print(v)
433399 1
434400 2
435401 3
436-
437402 >>> from collections import deque
438403 >>> deque_collections = deque([1, 2, 3])
439404 >>> for v in deque_collections:
@@ -449,7 +414,6 @@ def __repr__(self) -> str:
449414 Implements representation of the deque.
450415 Represents it as a list, with its values between '[' and ']'.
451416 Time complexity: O(n)
452-
453417 >>> our_deque = Deque([1, 2, 3])
454418 >>> our_deque
455419 [1, 2, 3]
0 commit comments