Ir para o conteúdo

Fila

Uma fila é uma estrutura de dados linear que segue o princípio FIFO (First In, First Out), onde o primeiro elemento a entrar é o primeiro a sair. Diferente de um arranjo ordenado, a fila não mantém ordenação, mas sim a ordem de chegada dos elementos. Quando implementada com lista encadeada, a fila se torna dinâmica, não necessitando de tamanho fixo.

Estrutura

Uma fila com lista encadeada pode ser representada por:

private Node head;
private Node tail;
private int size;

Cada nó contém um valor e uma referência para o próximo:

class Node {
    int value;
    Node next;

    public Node(int value) {
        this.value = value;
        this.next = null;
    }
}

Inserção (enqueue)

A inserção ocorre sempre no final da fila (tail).

Exemplo:

public void enqueue(int value) {
    Node newNode = new Node(value);

    if (isEmpty()) {
        head = tail = newNode;
    } else {
        tail.next = newNode;
        tail = newNode;
    }

    size++;
}

Remoção (dequeue)

A remoção ocorre sempre no início da fila (head).

public int dequeue() {
    if (isEmpty()) {
        throw new RuntimeException("Fila vazia");
    }

    int value = head.value;
    head = head.next;

    if (head == null) {
        tail = null;
    }

    size--;
    return value;
}

Consulta (peek)

Retorna o primeiro elemento sem remover.

public int peek() {
    if (isEmpty()) {
        throw new RuntimeException("Fila vazia");
    }

    return head.value;
}

Vantagens e desvantagens

A principal vantagem da fila está na eficiência de inserção e remoção dos elementos, que pode ser realizada em tempo constante.

Por outro lado, a fila não permite acesso direto a elementos intermediários e apenas o primeiro elemento pode ser removido.

Complexidade de Tempo (Big O)

A tabela a seguir resume as complexidades das principais operações:

OperaçãoComplexidade
EnqueueO(1)
DequeueO(1)
PeekO(1)

Exemplo de uso

A seguir é apresentada uma implementação completa de uma fila em Java.

public class Queue {
    private Node head;
    private Node tail;
    private int size;

    private class Node {
        int value;
        Node next;

        Node(int value) {
            this.value = value;
        }
    }

    public void enqueue(int value) {
        Node newNode = new Node(value);

        if (isEmpty()) {
            head = tail = newNode;
        } else {
            tail.next = newNode;
            tail = newNode;
        }

        size++;
    }

    public int dequeue() {
        if (isEmpty()) {
            throw new RuntimeException("Fila vazia");
        }

        int value = head.value;
        head = head.next;

        if (head == null) {
            tail = null;
        }

        size--;
        return value;
    }

    public int peek() {
        if (isEmpty()) {
            throw new RuntimeException("Fila vazia");
        }

        return head.value;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public void imprimir() {
        Node current = head;

        while (current != null) {
            System.out.print(current.value + " ");
            current = current.next;
        }

        System.out.println();
    }

    public static void main(String[] args) {
        Queue fila = new Queue();

        fila.enqueue(10);
        fila.enqueue(20);
        fila.enqueue(30);

        fila.imprimir(); // 10 20 30

        System.out.println("Removido: " + fila.dequeue()); // 10

        fila.imprimir(); // 20 30

        System.out.println("Primeiro: " + fila.peek()); // 20
    }
}

Exemplo de uso da Fila da plataforma Java

A classe LinkedList do Java também pode ser utilizada como uma fila (FIFO), pois implementa a interface Queue. Isso permite inserir elementos no final e remover do início de forma eficiente.

import java.util.LinkedList;
import java.util.Queue;

public class ExemploFila {

    public static void main(String[] args) {

        Queue<Integer> fila = new LinkedList<>();

        // enqueue (inserção no final)
        fila.add(10);
        fila.add(20);
        fila.add(30);
        fila.add(40);

        System.out.println("Fila: " + fila);

        // peek (consulta o primeiro)
        System.out.println("Primeiro elemento: " + fila.peek());

        // dequeue (remove do início)
        System.out.println("Removido: " + fila.poll());

        System.out.println("Fila após remoção: " + fila);

        // percorrer
        for (Integer valor : fila) {
            System.out.println(valor);
        }
    }
}

Em Java, além da LinkedList, também é possível utilizar a classe ArrayDeque como implementação de fila. Ela é baseada em um array circular, oferecendo inserções e remoções eficientes nas extremidades com custo O(1) na prática. Por não possuir a sobrecarga de nós encadeados, costuma apresentar melhor desempenho e menor consumo de memória em comparação com a LinkedList. Por isso, ArrayDeque é geralmente a opção mais recomendada para filas em aplicações reais, desde que não seja necessário trabalhar com valores null ou cenários concorrentes.

import java.util.ArrayDeque;

Queue<Integer> fila = new ArrayDeque<>();

Conclusão

A fila é uma estrutura baseada no príncipio FIFO, sendo amplamento utilizada em processamento de tarefas, sistemas de filas, algoritmos de busca em largura (BFS). Sua implementação com lista encadeada garante eficiência e flexibilidade, com operações principais em tempo constante.