Pular para conteúdo

Aula 09 - Filas (Queues): Princípio FIFO, Fila Circular e Deque 🧱

Objetivo Pedagógico

Objetivo: Estrutura First-In First-Out (FIFO), operações enqueue e dequeue. Implementação de fila circular com array para evitar realocação contínua e filas de extremidade dupla (Deque).


📑 1. Fundamentos Teóricos & Análise Estrutural

Estrutura First-In First-Out (FIFO), operações enqueue e dequeue. Implementação de fila circular com array para evitar realocação contínua e filas de extremidade dupla (Deque). O domínio desta estrutura de dados é primordial para o desenvolvimento de software escalável, onde o consumo de ciclos de CPU e a alocação de memória RAM na heap determinam a viabilidade operacional do sistema.

📐 Representação Abstrata & Mapeamento em Memória

graph LR
    A["Entrada de Dados"] --> B["Filas (Queues): Princípio FIFO, Fila Circular e Deque"]
    B --> C["Operação / Manipulação de Ponteiros"]
    C --> D["Resultado / Complexidade Assintótica"]

    style A fill:#e3f2fd,stroke:#1565c0
    style B fill:#fff3e0,stroke:#e65100,stroke-width:2px
    style C fill:#e8f5e9,stroke:#2e7d32
    style D fill:#f3e5f5,stroke:#7b1fa2

🔍 Pilares e Propriedades Algorítmicas

Nesta unidade, exploramos formalmente: - Princípio FIFO: Fundamento teórico indispensável para a correta aplicação computacional. - Enqueue e Dequeue O(1): Fundamento teórico indispensável para a correta aplicação computacional. - Fila Circular (% Módulo): Fundamento teórico indispensável para a correta aplicação computacional. - Filas de Impressão/Mensagens: Fundamento teórico indispensável para a correta aplicação computacional. - Deque: Fundamento teórico indispensável para a correta aplicação computacional.


🛠️ 2. Implementação Técnica em Linguagem C

Abaixo está o código de referência estruturado seguindo os padrões de boas práticas da linguagem C (ANSI C / C99), com gerenciamento dinâmico de memória e verificação de ponteiros nulos:

// Fila Circular em Array O(1)
#define CAP 8
typedef struct {
    int dados[CAP];
    int inicio, fim, total;
} FilaCircular;

bool fila_enqueue(FilaCircular* f, int valor) {
    if (f->total == CAP) return false; // Fila cheia
    f->dados[f->fim] = valor;
    f->fim = (f->fim + 1) % CAP;
    f->total++;
    return true;
}

int fila_dequeue(FilaCircular* f) {
    if (f->total == 0) return -1; // Fila vazia
    int val = f->dados[f->inicio];
    f->inicio = (f->inicio + 1) % CAP;
    f->total--;
    return val;
}

💡 Análise de Eficiência e Complexidade

  1. Complexidade Temporal: A implementação prioriza caminhos de execução diretos para atingir o menor custo assintótico possível.
  2. Gerenciamento de Memória: Toda alocação realizada na heap deve possuir uma rotina correspondente de liberação para assegurar vazamento zero de memória (zero memory leaks).
  3. Casos de Borda: Tratamento rigoroso de listas vazias, ponteiros nulos (NULL) e estouros de capacidade.

🎯 3. Próximos Passos & Sequência Didática