class QueueNode(object): def __init__(self, prev, value, nxt): self.value = value self.next = nxt self.prev = prev def __repr__(self): nval = self.next and self.next.value or None pval = self.prev and self.prev.value or None return f"[{repr(pval)}, {self.value}, {repr(nval)}]" class Queue(object): def __init__(self): self.begin = None self.end = None def count(self): """ Returns number of items. Regresa la cantidad de ítems. """ count = 0 node = self.begin while node: count += 1 node = node.prev return count def unshift(self): """ Removes the first item and returns its value. Remueve el primer ítem y regresa su valor. """ if self.begin is None: value = None else: value = self.begin.value if self.begin.prev is None: self.begin = self.end = None else: self.begin = self.begin.prev self.begin.next = None return value def shift(self, obj): """ Appends a new item on the begin of the list. Añade un nuevo ítem al inicio de la lista. """ node = QueueNode(None, obj, self.begin) if self.begin is None: self.begin = node self.end = self.begin else: self.begin.prev = self.end = node def drop(self): """ Removes the last item and returns its value. Remueve el último ítem y regresa su valor. """ value = self.end and self.end.value or None if value: if self.end.next is None: self.begin = self.end = None else: self.end = self.end.next self.end.prev = None return value def first(self): """ Returns value of first item. Regresa el valor del primer ítem. """ return self.begin and self.begin.value or None