Skip to content

Deque

class Deque:
    def __init__(self):
        self._deque = []

    def push_front(self, item):
        self._deque.insert(0, item)

    def push_back(self, item):
        self._deque.append(item)

    def pop_front(self):
        if self.is_empty():
            raise IndexError("Cannot pop from an empty deque")
        return self._deque.pop(0)

    def pop_back(self):
        if self.is_empty():
            raise IndexError("Cannot pop from an empty deque")
        return self._deque.pop()

    def is_empty(self):
        return len(self._deque) == 0


# From scratch


class DequeNode:
    def __init__(self, value):
        self.value = value
        self.next = None
        self.prev = None


class DequeScratch:
    def __init__(self):
        self.head = None
        self.tail = None
        self.size = 0

    def is_empty(self):
        return self.size == 0

    def add_first(self, value):
        new_node = DequeNode(value)
        if self.is_empty():
            self.head = new_node
            self.tail = new_node
        else:
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node
        self.size += 1

    def add_last(self, value):
        new_node = DequeNode(value)
        if self.is_empty():
            self.head = new_node
            self.tail = new_node
        else:
            new_node.prev = self.tail
            self.tail.next = new_node
            self.tail = new_node
        self.size += 1

    def remove_first(self):
        if self.is_empty():
            raise Exception("Deque is empty")
        value = self.head.value
        if self.head == self.tail:
            self.head = None
            self.tail = None
        else:
            self.head = self.head.next
            self.head.prev = None
        self.size -= 1
        return value

    def remove_last(self):
        if self.is_empty():
            raise Exception("Deque is empty")
        value = self.tail.value
        if self.head == self.tail:
            self.head = None
            self.tail = None
        else:
            self.tail = self.tail.prev
            self.tail.next = None
        self.size -= 1
        return value


d = Deque()
d.push_front("a")
d.push_back("b")
d.push_front("c")
d.push_back("d")
while not d.is_empty():
    print(d.pop_front(), d.pop_back())