Python: Pilhas, Filas e Filas Prioritárias
As estruturas de dados são fundamentais em qualquer linguagem de programação. Elas permitem que você organize e manipule dados de maneira eficiente. Neste artigo, vamos explorar três estruturas de dados essenciais em Python: pilhas, filas e filas prioritárias. Veremos suas características, usos e implementações práticas.
Pilhas (Stacks)
Uma pilha é uma estrutura de dados que segue a política LIFO (Last In, First Out), ou seja, o último elemento inserido é o primeiro a ser removido. Pense em uma pilha de pratos, onde você sempre coloca ou remove o prato do topo.
Implementação de Pilha
Em Python, podemos implementar uma pilha usando uma lista. Vamos ver um exemplo:
class Stack: def __init__(self): self.items = [] def is_empty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def size(self): return len(self.items) # Uso stack = Stack() stack.push(1) stack.push(2) stack.push(3) print(stack.pop()) # Saída: 3 print(stack.peek()) # Saída: 2 print(stack.size()) # Saída: 2
Neste exemplo, a classe
Stack
fornece métodos para adicionar (push
), remover (pop
) e verificar o elemento no topo da pilha (peek
), além de verificar se a pilha está vazia (is_empty
) e o tamanho da pilha (size
).Filas (Queues)
Uma fila segue a política FIFO (First In, First Out), onde o primeiro elemento inserido é o primeiro a ser removido. Um exemplo clássico é uma fila de pessoas esperando para serem atendidas.
Implementação de Fila
Em Python, podemos usar a coleção
deque
da biblioteca collections
para implementar uma fila de maneira eficiente:from collections import deque class Queue: def __init__(self): self.items = deque() def is_empty(self): return len(self.items) == 0 def enqueue(self, item): self.items.append(item) def dequeue(self): return self.items.popleft() def size(self): return len(self.items) # Uso queue = Queue() queue.enqueue(1) queue.enqueue(2) queue.enqueue(3) print(queue.dequeue()) # Saída: 1 print(queue.size()) # Saída: 2
A classe
Queue
fornece métodos para adicionar (enqueue
), remover (dequeue
) elementos, verificar se a fila está vazia (is_empty
) e o tamanho da fila (size
).Filas Prioritárias (Priority Queues)
Uma fila prioritária é uma estrutura onde cada elemento tem uma prioridade associada. Os elementos são removidos de acordo com sua prioridade, com os de maior prioridade sendo removidos primeiro. Imagine uma situação de emergência médica onde os pacientes mais graves são atendidos primeiro.
Implementação de Fila Prioritária
Em Python, podemos usar o módulo
heapq
para implementar uma fila prioritária:import heapq class PriorityQueue: def __init__(self): self.heap = [] def is_empty(self): return len(self.heap) == 0 def enqueue(self, item, priority): heapq.heappush(self.heap, (priority, item)) def dequeue(self): return heapq.heappop(self.heap)[1] def size(self): return len(self.heap) # Uso priority_queue = PriorityQueue() priority_queue.enqueue("task1", 2) priority_queue.enqueue("task2", 1) priority_queue.enqueue("task3", 3) print(priority_queue.dequeue()) # Saída: task2 print(priority_queue.size()) # Saída: 2
A classe
PriorityQueue
permite adicionar elementos com uma prioridade (enqueue
), remover o elemento com a maior prioridade (dequeue
), verificar se a fila está vazia (is_empty
) e o tamanho da fila (size
).Pilhas, filas e filas prioritárias são estruturas de dados essenciais em Python, cada uma adequada para diferentes tipos de problemas. As pilhas são úteis quando você precisa de uma estrutura LIFO, as filas são ideais para políticas FIFO e as filas prioritárias são indispensáveis quando os elementos precisam ser processados com base em suas prioridades. Compreender e saber implementar essas estruturas é fundamental para qualquer desenvolvedor.
Esperamos que este artigo tenha sido útil para você entender e implementar essas estruturas de dados em Python. Pratique os exemplos fornecidos e experimente criar suas próprias variações para se aprofundar ainda mais!