Implementação de Pilha e Fila em Estruturas de Dados

Pilha (Stack)

Conceito de Pilha

A pilha é uma lista linear especial que permite operações de inserção e remoção apenas em uma extremidade, denominada topo. A outra extremdiade é chamada de base. Os dados seguem o princípio LIFO (Last In First Out), ou seja, o último elemento inserido é o primeiro a ser removido.

Empilhamento: refere-se à operação de inserção, onde novos elementos são adicionados no topo da pilha.

Desempilhamento: corresponde à operação de remoção, onde o elemento no topo é retirado.

Métodos Comuns

// Empilhar um valor
public void empilhar(int valor)
    
// Desempilhar e retornar o elemento do topo
public int desempilhar()
    
// Consultar o elemento do topo sem removê-lo
public int espiar()
    
// Verificar se a pilha está vazia
public boolean estaVazio()

Implementação da Pilha

Criação de uma pilha vazia:

public class Pilha {
    private int[] dados;
    private int contador;
    private static final int CAPACIDADE_INICIAL = 10;

    public Pilha() {
        this.dados = new int[CAPACIDADE_INICIAL];
    }
}

Implementação do método empilhar:

public void empilhar(int valor) {
    if (this.dados.length == contador) {
        this.dados = Arrays.copyOf(this.dados, this.dados.length * 2);
    }
    this.dados[contador] = valor;
    contador++;
}

Implementação do método desempilhar:

Em caso de pilha vazia, uma exceção personalizada é lançada.

public class PilhaVaziaException extends RuntimeException {
    public PilhaVaziaException() {
    }

    public PilhaVaziaException(String mensagem) {
        super(mensagem);
    }
}

public int desempilhar() {
    if (contador == 0) {
        throw new PilhaVaziaException();
    }
    int valorRemovido = this.dados[contador - 1];
    contador--;
    return valorRemovido;
}

Implementação do método espiar:

public int espiar() {
    if (contador == 0) {
        throw new PilhaVaziaException();
    }
    return this.dados[contador - 1];
}

Implemnetação do método estaVazio:

public boolean estaVazio() {
    return contador == 0;
}

Fila (Queue)

Conceito de Fila

A fila é uma lista linear especial que permite inserção em uma extremidade (cauda) e remoção na outra extremidade (cabeça), seguindo o princípio FIFO (First In First Out). Em Java, a interface Queue é frequentemente implementada usando listas ligadas.

Enfileiramento: a operação de inserção ocorre na cauda da fila.

Desenfileiramento: a operação de remoção ocorre na cabeça da fila.

Métodos Comuns

// Enfileirar um elemento
public void enfileirar(int x)
    
// Desenfileirar e retornar o elemento da cabeça
public int desenfileirar()

// Obter o elemento da cabeça sem removê-lo
public int espiar()

// Retornar o número de elementos na fila
public int tamanho()
    
// Verificar se a fila está vazia
public boolean estaVazio()

Implementação da Fila com Lista Duplamente Ligada

public class Fila {
    static class No {
        public int valor;
        public No proximo;
        public No anterior;

        public No(int valor) {
            this.valor = valor;
        }
    }

    public No cabeca;
    public No cauda;
    public int quantidade = 0;
    
}

Implementação do método enfileirar:

public void enfileirar(int x) {
    No novoNo = new No(x);
    if (cabeca == null) {
        cabeca = cauda = novoNo;
    } else {
        novoNo.proximo = cabeca;
        cabeca.anterior = novoNo;
        cabeca = novoNo;
    }
    quantidade++;
}

Implementação do método desenfileirar:

public int desenfileirar() {
    if (cabeca == null) {
        return -1;
    }
    int valorRetorno = cauda.valor;
    if (cabeca == cauda) {
        cabeca = null;
        cauda = null;
        quantidade--;
        return valorRetorno;
    }
    cauda = cauda.anterior;
    cauda.proximo = null;
    quantidade--;
}

Implementação do método espiar:

public int espiar() {
    if (cabeca == null) {
        return -1;
    }
    return cabeca.valor;
}

Implementação do método tamanho:

public int tamanho() {
    return quantidade;
}

Implementação do método estaVazio:

public boolean estaVazio() {
    return cabeca == null;
}

Implementação de Fila Circular

public class FilaCircular {
    public int[] elementos;
    public int cabeca;
    public int cauda;

    public FilaCircular(int capacidade) {
        this.elementos = new int[capacidade + 1];
    }

    public boolean enfileirar(int valor) {
        if (estaCheia()) {
            return false;
        }
        elementos[cauda] = valor;
        cauda = (cauda + 1) % elementos.length;
        return true;
    }

    private boolean estaCheia() {
        return (cauda + 1) % elementos.length == cabeca;
    }

    public boolean desenfileirar() {
        if (estaVazia()) {
            return false;
        }
        cabeca = (cabeca + 1) % elementos.length;
        return true;
    }

    public int obterCabeca() {
        if (estaVazia()) {
            return -1;
        }
        return elementos[cabeca];
    }

    public boolean estaVazia() {
        return cabeca == cauda;
    }
}

Tags: java pilha fila Estruturas de Dados implementação

Publicado em 7-27 03:00