(conteúdo gerado por LLMs)
Uma fila (ou Queue) é uma estrutura de dados fundamental que segue o princípio FIFO (First-In, First-Out), ou seja: o primeiro a entrar é o primeiro a sair. Pense em uma fila de banco real.
Em Python, embora possamos usar listas comuns, a maneira mais eficiente e profissional de implementar uma fila é utilizando a classe deque do módulo collections.
Neste exemplo, vamos simular a entrada de clientes e o processamento de cada um.
from collections import deque
# 1. Criando a fila
fila_atendimento = deque()
# 2. Adicionando elementos (Enqueue)
print("--- Chegada de Clientes ---")
fila_atendimento.append("Ana")
fila_atendimento.append("Bruno")
fila_atendimento.append("Carla")
print(f"Fila atual: {list(fila_atendimento)}")
# 3. Removendo elementos (Dequeue)
print("\n--- Iniciando Atendimento ---")
while fila_atendimento:
cliente_atual = fila_atendimento.popleft() # Remove do início da fila
print(f"Atendendo: {cliente_atual}")
print(f"Restam na fila: {list(fila_atendimento)}")
print("\nTodos os clientes foram atendidos!")Embora você possa usar list.pop(0) para remover o primeiro item de uma lista, isso é lento em termos computacionais.
- Listas: Remover o primeiro elemento obriga o Python a deslocar todos os outros itens uma posição para a esquerda. Complexidade: .
- Deque: Foi desenhado para permitir adições e remoções rápidas em ambas as extremidades. Complexidade: .
| Operação | Método | Descrição |
|---|---|---|
| Inserir | append(item) |
Adiciona um item ao final da fila. |
| Remover | popleft() |
Remove e retorna o item no início da fila. |
| Espiar | fila[0] |
Olha quem é o próximo sem removê-lo. |
| Tamanho | len(fila) |
Retorna quantos itens estão na fila. |
Em C, a implementação de uma fila é um pouco mais manual do que em Python, pois não temos uma estrutura pronta de alto nível. Geralmente, usamos Arrays (para tamanhos fixos) ou Listas Encadeadas (para tamanhos dinâmicos).
Para fins didáticos, vamos usar um Array com dois índices: um para o inicio e outro para o fim.
#include <stdio.h>
#include <stdbool.h>
#define TAMANHO 5
// Estrutura da Fila
typedef struct {
int itens[TAMANHO];
int inicio;
int fim;
} Fila;
// Função para inicializar a fila
void inicializar(Fila *f) {
f->inicio = 0;
f->fim = 0;
}
// Verifica se a fila está cheia
bool estaCheia(Fila *f) {
return f->fim == TAMANHO;
}
// Verifica se a fila está vazia
bool estaVazia(Fila *f) {
return f->inicio == f->fim;
}
// Adiciona um elemento (Enqueue)
void enfileirar(Fila *f, int valor) {
if (estaCheia(f)) {
printf("Erro: A fila está cheia!\n");
} else {
f->itens[f->fim] = valor;
f->fim++;
printf("Senha %d entrou na fila.\n", valor);
}
}
// Remove um elemento (Dequeue)
int desenfileirar(Fila *f) {
if (estaVazia(f)) {
printf("Erro: A fila está vazia!\n");
return -1;
} else {
int valor = f->itens[f->inicio];
f->inicio++;
return valor;
}
}
int main() {
Fila minhaFila;
inicializar(&minhaFila);
// Adicionando clientes (representados por números de senha)
enfileirar(&minhaFila, 101);
enfileirar(&minhaFila, 102);
enfileirar(&minhaFila, 103);
printf("\n--- Processando Atendimento ---\n");
while (!estaVazia(&minhaFila)) {
int atendido = desenfileirar(&minhaFila);
printf("Atendendo senha: %d\n", atendido);
}
return 0;
}Ao migrar de Python para C, note estas particularidades:
- Gerenciamento de Memória: Em Python, a fila cresce conforme necessário. Em C (usando arrays), você precisa definir o
TAMANHOmáximo de antemão ou gerenciar memória manualmente commalloc. - Acesso Direto: Em C, usamos ponteiros (
Fila *f) para modificar a estrutura original dentro das funções. - Desperdício de Espaço: No exemplo acima, conforme removemos itens, o espaço no início do array fica "inutilizado". Em sistemas reais, usamos uma Fila Circular para reaproveitar esses espaços.
inicio: Aponta para o próximo elemento a ser removido.fim: Aponta para a próxima posição livre para inserção.- Complexidade: Ambas as operações de inserir e remover neste exemplo são , o que é excelente para performance.
Você gostaria que eu mostrasse como transformar esse exemplo em uma Fila Circular para que ela nunca "acabe" conforme você remove itens?