StacksQueues/Python/ArrayDeque
From charlesreid1
See code on git.charlesreid1.com: https://git.charlesreid1.com/cs/python/src/master/stacks-queues-deques/deque/ArrayDeque.py
Double-ended queue (deque) implemented using an underlying array-based structure - a list. (See also: Arrays/Python
ArrayDeque test
if __name__=="__main__": d = ArrayDeque() for i,c in enumerate("ABCDEFGHIJKLMNOP"): d.add_first(c) print(d) for j in range(100): try: d.delete_first() print(d) except Empty: pass print("Length of d: {0}".format(len(d))) for i,c in enumerate("12345"): d.add_last(c) print(d) for j in range(4): d.delete_last() print(d) print("final:") print(d)
ArrayDeque class
""" Deque (double-ended queue) ADT ArrayDeque: implements an array-based double-ended queue A deque object D implements the following core methods: * D.add_first : add the item to the front of the deque * D.add_last : add the item to the end of the deque * D.delete_first : remove and return the ifrst item from the deque * D.delete_last : remove and return the last item from the deque Additional convenience methods: * D.first : peek at first item * D.last : peek at last item * D.is_empty : returns True if deque has no elements * D.__len__ : length * D.__str__ : turn into string) Private utility methods: * D._resize : resize the deque (dynamic growth/shrinkage) """ class Empty(Exception): pass class ArrayDeque: """ """ def __init__(self): INIT_CAP = 10 self._first = 0 self._data = [None]*INIT_CAP self._n = 0 def __len__(self): """length of deque""" return self._n def __str__(self): """string representation of deque""" return str(self._data) def is_empty(self): """returns true if deque is empty""" return self._n==0 def add_first(self, e): """add item to beginning of deque""" if(self._n==len(self._data)): self._resize(2*self._n) # First minus one because moving one index ahead of first addix = (self._first - 1)%len(self._data) self._data[addix] = e self._first = addix self._n += 1 def add_last(self, e): """add item to end of deque""" if(self._n==len(self._data)): self._resize(2*self._n) # First plus n: jumping to the next open index, # which must be index first + n. # If there are n items starting at first, then they will be # at first through (first + n - 1). # Next open index is at first + n. addix = (self._first + self._n)%(len(self._data)) self._data[addix] = e self._n += 1 def delete_first(self): if(not self.is_empty()): ret = self._data[self._first] self._data[self._first] = None self._first = (self._first + 1)%(len(self._data)) self._n -= 1 # If we're down to smaller than a quarter occupied, # cut array size in half. if(self._n < len(self._data)//4): self._resize(len(self._data)//2) else: raise Empty("oops, empty deque") def delete_last(self): if(not self.is_empty()): getix = (self._first + self._n - 1)%(len(self._data)) ret = self._data[getix] self._data[getix] = None self._n -= 1 # If we're down to smaller than a quarter occupied, # cut array size in half. if(self._n < len(self._data)//4): self._resize(len(self._data)//2) else: raise Empty("oops, empty deque") def _resize(self,newcap): """private method: resize the underlying array""" old = self._data self._data = [None]*newcap walk = self._first # Need to pay close attention here: # range over each of the n elements for k in range(self._n): self._data[k] = old[walk] # Increment walk after the update, not before walk += 1 walk %= len(old) self._first = 0
ArrayDeque test output
$ python ArrayDeque.py [None, None, None, None, None, None, None, None, None, 'A'] [None, None, None, None, None, None, None, None, 'B', 'A'] [None, None, None, None, None, None, None, 'C', 'B', 'A'] [None, None, None, None, None, None, 'D', 'C', 'B', 'A'] [None, None, None, None, None, 'E', 'D', 'C', 'B', 'A'] [None, None, None, None, 'F', 'E', 'D', 'C', 'B', 'A'] [None, None, None, 'G', 'F', 'E', 'D', 'C', 'B', 'A'] [None, None, 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A'] [None, 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, None, 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, 'L', 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, 'M', 'L', 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, 'N', 'M', 'L', 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, 'O', 'N', 'M', 'L', 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, 'P', 'O', 'N', 'M', 'L', 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, 'O', 'N', 'M', 'L', 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, 'N', 'M', 'L', 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, 'M', 'L', 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, 'L', 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, None, 'K'] ['J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, None, None] [None, 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, None, None] [None, None, 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, None, None] [None, None, None, 'G', 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, None, None] [None, None, None, None, 'F', 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, None, None] [None, None, None, None, None, 'E', 'D', 'C', 'B', 'A', None, None, None, None, None, None, None, None, None, None] ['D', 'C', 'B', 'A', None, None, None, None, None, None] [None, 'C', 'B', 'A', None, None, None, None, None, None] [None, None, 'B', 'A', None, None, None, None, None, None] ['A', None, None, None, None] [None, None] Length of d: 0 ['1', None] ['1', '2'] ['1', '2', '3', None] ['1', '2', '3', '4'] ['1', '2', '3', '4', '5', None, None, None] ['1', '2', '3', '4', None, None, None, None] ['1', '2', '3', None, None, None, None, None] ['1', '2', None, None, None, None, None, None] ['1', None, None, None] final: ['1', None, None, None]
Flags
Stacks and Queues Part of Computer Science Notes
Series on Data Structures
Stacks and Queues: Python StacksQueues/Python · StacksQueues/Python/ArrayStack · StacksQueues/Python/ArrayQueue · StacksQueues/Python/ArrayDeque StacksQueues/Python/LinkedStack
Stacks and Queues: Java StacksQueues/Java · StacksQueues/Java/ArrayStack · StacksQueues/Java/ArrayQueue · StacksQueues/Java/ArrayQueueFS · StacksQueues/Java/ArrayDeque StacksQueues/Java/LinkedStack · StacksQueues/Java/LinkedQueue · StacksQueues/Java/LinkedDeque
Applications Postfix_Expressions#Stacks · StacksQueues/Subsets · StacksQueues/Subsets/Java
|