Skip to main content
Queue Pattern

What is Queue?

Queue is a FIFO (First In, First Out) data structure where elements are added at the back and removed from the front. It’s essential for level-order processing and scheduling.

When to Use

BFS

Level-order traversal, shortest path

Scheduling

Task queues, round-robin

Sliding Window

With deque for O(1) operations

Streaming Data

Moving averages, recent items

Pattern Variations

1. Implement Queue using Stacks

class MyQueue:
    """FIFO queue using two LIFO stacks"""
    
    def __init__(self):
        self.inbox = []   # For push
        self.outbox = []  # For pop/peek
    
    def push(self, x):
        self.inbox.append(x)
    
    def pop(self):
        self._transfer()
        return self.outbox.pop()
    
    def peek(self):
        self._transfer()
        return self.outbox[-1]
    
    def empty(self):
        return not self.inbox and not self.outbox
    
    def _transfer(self):
        if not self.outbox:
            while self.inbox:
                self.outbox.append(self.inbox.pop())

2. Moving Average from Data Stream

from collections import deque

class MovingAverage:
    """Calculate moving average of last n elements"""
    
    def __init__(self, size):
        self.size = size
        self.queue = deque()
        self.total = 0
    
    def next(self, val):
        self.queue.append(val)
        self.total += val
        
        if len(self.queue) > self.size:
            self.total -= self.queue.popleft()
        
        return self.total / len(self.queue)

3. Sliding Window Maximum (Monotonic Deque)

from collections import deque

def max_sliding_window(nums, k):
    """Maximum in each window of size k"""
    result = []
    dq = deque()  # Store indices, values in decreasing order
    
    for i in range(len(nums)):
        # Remove indices out of window
        while dq and dq[0] <= i - k:
            dq.popleft()
        
        # Remove smaller elements
        while dq and nums[dq[-1]] < nums[i]:
            dq.pop()
        
        dq.append(i)
        
        # Add to result once window is formed
        if i >= k - 1:
            result.append(nums[dq[0]])
    
    return result

4. BFS Level Order Traversal

from collections import deque

def level_order(root):
    """Binary tree level order traversal"""
    if not root:
        return []
    
    result = []
    queue = deque([root])
    
    while queue:
        level = []
        level_size = len(queue)
        
        for _ in range(level_size):
            node = queue.popleft()
            level.append(node.val)
            
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        
        result.append(level)
    
    return result

Classic Problems

ProblemPatternKey Insight
BFS TraversalStandard queueProcess level by level
Sliding Window MaxMonotonic dequeKeep decreasing order
Queue via StacksTwo stacksAmortized O(1) operations
Moving AverageFixed-size queueRunning sum optimization
Task SchedulerPriority queueCool down management

Practice Problems