1+ class ArrayQueue (object ):
2+ """ FIFO queue implementation using a Python list as underlying storage. """
3+ default_capacity = 10 # moderate capacity for all new queues
4+
5+ def __init__ (self ):
6+ """ made an empty queue. """
7+ self ._data = [None ] * ArrayQueue .default_capacity
8+ self ._size = 0
9+ self ._front = 0
10+
11+ def __len__ (self ):
12+ """ Return the number of elements in the queue. """
13+ return self ._size
14+
15+ def is_empty (self ):
16+ """ Return True if the queue is empty. """
17+ return self ._size == 0
18+
19+ def first (self ):
20+ """ Return (but do not remove) the element at the front of the queue. """
21+ if self .is_empty ():
22+ raise ('Queue is empty' )
23+ return self ._data [self ._front ]
24+
25+ def dequeue (self ):
26+ """ Remove and return the first element of the queue (i.e., FIFO). """
27+ if self .is_empty ():
28+ raise ('Queue is empty' )
29+ item_out = self ._data [self ._front ]
30+ self ._data [self ._front ] = None # help garbage collection
31+ self ._front = (self ._front + 1 ) % len (self ._data ) # implement a circular array. reset front position
32+ self ._size -= 1
33+ return item_out
34+
35+ def enqueue (self , e ):
36+ """ Add an element to the back of queue. """
37+ if self ._size == len (self ._data ):
38+ self .resize (2 * len (self ._data )) # if queue is full, double the array size
39+ empty_position = (self ._front + self ._size ) % len (self .data )
40+ self ._data [empty_position ] = e
41+ self ._size += 1
42+
43+ def _resize (self , cap ):
44+ """ Resize to a new list of capacity >= len(self)."""
45+ oldList = self ._data # keep track of existing list
46+ self ._data = [None ] * cap # allocate list with new capacity
47+ walk = self ._front
48+ for k in range (self ._size ): # only consider existing elements
49+ self ._data [k ] = oldList [walk ]
50+ walk = (1 + walk ) % len (oldList )
51+ self ._front = 0
52+
53+
54+
55+
56+
57+
58+
0 commit comments