Category: Stacks & Queues
Topics: BFS, task scheduling, message queues, buffering
A linear data structure following First-In-First-Out (FIFO) principle, where elements are added at the rear and removed from the front.
| Operation | Time | Description |
|---|---|---|
| Enqueue | O(1) | Add element to rear |
| Dequeue | O(1) | Remove and return front element |
| Peek/Front | O(1) | View front element without removing |
| IsEmpty | O(1) | Check if queue is empty |
| Size | O(1) | Get number of elements |
# Using collections.deque (recommended)
from collections import deque
queue = deque()
queue.append(1) # Enqueue
queue.append(2)
front = queue.popleft() # Dequeue - returns 1
peek = queue[0] # Peek front
# Using queue.Queue (thread-safe)
from queue import Queue
q = Queue()
q.put(1) # Enqueue
q.put(2)
front = q.get() # Dequeue - blocks if empty
# Queue class implementation
class Queue:
def __init__(self):
self.items = deque()
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
if self.is_empty():
raise IndexError("Queue is empty")
return self.items.popleft()
def peek(self):
if self.is_empty():
raise IndexError("Queue is empty")
return self.items[0]
def is_empty(self):
return len(self.items) == 0
def size(self):
return len(self.items)
# BFS using queue
def bfs(graph, start):
visited = set([start])
queue = deque([start])
result = []
while queue:
node = queue.popleft()
result.append(node)
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
return result
# Level-order tree traversal
def level_order(root):
if not root:
return []
result = []
queue = deque([root])
while queue:
level = []
for _ in range(len(queue)):
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
Warning: Using Python list with pop(0) is O(n). Always use collections.deque for queues.
O(n) for n elements. Deque implementation uses a doubly-linked list of fixed-size blocks.
Pros:
Cons: