more-python/exercises/ex15/queue.py

78 lines
2.1 KiB
Python

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