16

Day 16: Advanced Data Structures

Chapter 16 • Advanced

50 min

Advanced data structures help you solve complex problems efficiently. They provide better ways to organize and access data.

What are Advanced Data Structures?

Advanced data structures are specialized ways to store and organize data that offer specific advantages for certain operations.

Key Advanced Structures:

  • Stacks - Last In, First Out (LIFO)
  • Queues - First In, First Out (FIFO)
  • Deques - Double-ended queues
  • Heaps - Priority queues
  • Linked Lists - Dynamic data structures
  • Trees - Hierarchical data organization
  • Graphs - Network relationships

Stack Operations:

  • push() - Add element to top
  • pop() - Remove element from top
  • peek() - View top element
  • isEmpty() - Check if empty

Queue Operations:

  • enqueue() - Add element to rear
  • dequeue() - Remove element from front
  • front() - View front element
  • isEmpty() - Check if empty

Benefits:

  • Efficient Operations - Fast access and modification
  • Problem Solving - Solve complex algorithms
  • Memory Management - Optimize memory usage
  • Real-world Applications - Used in many systems

Hands-on Examples

Stack and Queue Implementation

# Stack implementation using list
class Stack:
    def __init__(self):
        self.items = []
    
    def push(self, item):
        self.items.append(item)
    
    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        return None
    
    def peek(self):
        if not self.is_empty():
            return self.items[-1]
        return None
    
    def is_empty(self):
        return len(self.items) == 0
    
    def size(self):
        return len(self.items)

# Queue implementation using list
class Queue:
    def __init__(self):
        self.items = []
    
    def enqueue(self, item):
        self.items.append(item)
    
    def dequeue(self):
        if not self.is_empty():
            return self.items.pop(0)
        return None
    
    def front(self):
        if not self.is_empty():
            return self.items[0]
        return None
    
    def is_empty(self):
        return len(self.items) == 0
    
    def size(self):
        return len(self.items)

# Test Stack
print("Stack Operations:")
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(f"Stack: {stack.items}")
print(f"Peek: {stack.peek()}")
print(f"Pop: {stack.pop()}")
print(f"Stack after pop: {stack.items}")

# Test Queue
print("\nQueue Operations:")
queue = Queue()
queue.enqueue('A')
queue.enqueue('B')
queue.enqueue('C')
print(f"Queue: {queue.items}")
print(f"Front: {queue.front()}")
print(f"Dequeue: {queue.dequeue()}")
print(f"Queue after dequeue: {queue.items}")

This example shows how to implement basic stack and queue data structures using Python lists. Stacks use LIFO while queues use FIFO principles.