class DLLQueue(object): def __init__(self, list_object=None): self.data = DoublyLinkedList() self.size = 0 if list_object: self.data.build(list_object) def __len__(self): return self.size def is_empty(self): return self.size == 0 def peek(self): return self.data.tail_value def enqueue(self, item): self.data.insert_front_value(item) self.size += 1 def dequeue(self): if self.size == 0: raise IndexError('Unable to dequeue, Queue is empty.') value = self.data.pop_back_value() self.size -= 1 return value
class DLLDeque(object): def __init__(self, list_object=None): self.data = DoublyLinkedList() self.size = 0 if list_object: self.data.build(list_object) self.size = len(list_object) def __len__(self): return self.size def is_empty(self): return self.size == 0 def first(self): return self.data.head_value def last(self): return self.data.tail_value def appendfront(self, item): self.data.insert_front_value(item) self.size += 1 def appendback(self, item): self.data.insert_end_value(item) self.size += 1 def popfront(self): if self.size == 0: raise IndexError('Unable to popfront, Deque is empty.') self.size -= 1 return self.data.pop_front_value() def popback(self): if self.size == 0: raise IndexError('Unable to popback, Deque is empty.') self.size -= 1 return self.data.pop_back_value()
def run_test(ops): DS = DoublyLinkedList() ans = [] if verbose: print(DS) for op in ops: if verbose: print(*op) if op[0] == "insert_first": x = op[1] DS.insert_first(x) if op[0] == "insert_last": x = op[1] DS.insert_last(x) if op[0] == "delete_first": ans.append(DS.delete_first()) if op[0] == "delete_last": ans.append(DS.delete_last()) if (op[0] == "splice/remove") and DS.head: i, n = op[1], op[2] L = DoublyLinkedList() L.build(range(n)) if verbose: print('L: ', L) x1 = DS.head.later_node(i) x2 = x1.next DS.splice(x1, L) assert x2 != None for _ in range(n): L = DS.remove(x1.next, x2.prev) x2 = x1.next DS.splice(x1, L) if verbose: print(DS) ans.append(tuple([x for x in DS])) return ans