Skip to content

Stacks and Queues ​

Stacks and Queues are both array like structures that have different methods for storing and removing values from them. You can only add elements to the head of a stack or a queue by design.

Stacks ​

Stacks follow the LIFO rule: Last In, First Out. This can be thought of as a stack of plates, where you add plates to the top of the stack, and then also remove them from the top. This is typically implemented with a singularly linked list or a dynamic array.

python
class Node:
    def __init__(self, val):
        self.next = None
        self.val = val

class Stack:
    def __init__(self):
        self.head = None

    def push(self, node):
        node.next = self.head
        self.head = node

    def pop(self):
        ret = self.head
        self.head = self.head.next
        return ret
    
    def peek(self):
        return self.head.val if self.head else None

Complexity ​

  • Pushing onto stack: O(1)
  • Popping off stack: O(1)
  • Peeking the top element: O(1)
  • Searching: O(n)

Queue ​

Queues follow the FIFO rule: First In, First Out. This can be thought of a line of people, where the first person in the line is the first to leave. These are typically implemented with a doubly linked list

python
class Node:
    def __init__(self, val):
        self.val = val
        self.next = None
        self.prev = None

class Queue:
    def __init__(self):
        self.head = None
        self.tail = None

    def enqueue(self, node):
        self.head.prev = node
        node.next = self.head
        self.head = node

    def dequeue(self, node):
        ret = self.tail
        self.tail = self.tail.prev
        self.tail.next = None
        return ret

    def peek(self):
        return self.tail.val if self.tail else None

Complexity ​

  • Enqueuing (adding) to queue: O(1)
  • Dequeuing (removing) from queue: O(1)
  • Peeking the front element: O(1)
  • Searching: O(n)