Pilhas (Stack) e Sua Implementação em Java

Uma pilha, ou stack, é uma estrutura de dados linear que segue o princípio LIFO (Last In, First Out), onde o último elemento adicionado é o primeiro a ser removido. As pilhas são úteis em diversas aplicações, como controle de chamadas em funções recursivas, verificações de parênteses balanceados e navegadores web (para armazenar o histórico de navegação).

Em Java, podemos implementar pilhas de duas maneiras principais: usando a classe Stack fornecida na biblioteca Java e utilizando outras estruturas de dados, como LinkedList ou ArrayDeque.

Operações Básicas em uma Pilha

  1. push(element): Adiciona um elemento no topo da pilha.
  2. pop(): Remove e retorna o elemento no topo da pilha.
  3. peek(): Retorna o elemento no topo sem removê-lo.
  4. isEmpty(): Verifica se a pilha está vazia.

Implementação Usando a Classe Stack

A classe Stack em Java faz parte do pacote java.util e oferece métodos úteis para manipulação de pilhas. Vamos ver como ela funciona:

import java.util.Stack;

public class ExemploPilha {
    public static void main(String[] args) {
        Stack<Integer> pilha = new Stack<>();

        // Adicionando elementos à pilha
        pilha.push(10);
        pilha.push(20);
        pilha.push(30);

        System.out.println("Pilha após push: " + pilha);

        // Visualizando o elemento do topo com peek
        System.out.println("Elemento no topo: " + pilha.peek());

        // Removendo elementos da pilha com pop
        System.out.println("Elemento removido: " + pilha.pop());
        System.out.println("Pilha após pop: " + pilha);

        // Verificando se a pilha está vazia
        System.out.println("A pilha está vazia? " + pilha.isEmpty());
    }
}

Saída Esperada

Pilha após push: [10, 20, 30]
Elemento no topo: 30
Elemento removido: 30
Pilha após pop: [10, 20]
A pilha está vazia? false

Explicação do Código

  1. Criação da Pilha: Uma instância de Stack é criada para armazenar valores inteiros.
  2. Push: Elementos são adicionados com o método push.
  3. Peek e Pop: peek permite visualizar o topo da pilha sem remover o elemento, enquanto pop o remove.
  4. isEmpty: Verifica se a pilha está vazia.

Implementação com ArrayDeque

A classe ArrayDeque é preferida em muitos casos por ser mais rápida e consumir menos memória do que a Stack. Vamos ver um exemplo de uso:

import java.util.ArrayDeque;
import java.util.Deque;

public class ExemploPilhaArrayDeque {
    public static void main(String[] args) {
        Deque<String> pilha = new ArrayDeque<>();

        // Adicionando elementos à pilha
        pilha.push("Primeiro");
        pilha.push("Segundo");
        pilha.push("Terceiro");

        System.out.println("Pilha após push: " + pilha);

        // Removendo o elemento do topo
        System.out.println("Elemento removido: " + pilha.pop());
        System.out.println("Pilha após pop: " + pilha);

        // Visualizando o elemento do topo
        System.out.println("Elemento no topo: " + pilha.peek());
    }
}

Saída Esperada

Pilha após push: [Terceiro, Segundo, Primeiro]
Elemento removido: Terceiro
Pilha após pop: [Segundo, Primeiro]
Elemento no topo: Segundo

Implementação com LinkedList

Outra alternativa para criar uma pilha é usar a classe LinkedList.

import java.util.LinkedList;

public class ExemploPilhaLinkedList {
    public static void main(String[] args) {
        LinkedList<Double> pilha = new LinkedList<>();

        // Adicionando elementos
        pilha.push(3.14);
        pilha.push(1.618);
        pilha.push(2.718);

        System.out.println("Pilha após push: " + pilha);

        // Removendo o elemento do topo
        System.out.println("Elemento removido: " + pilha.pop());
        System.out.println("Pilha após pop: " + pilha);

        // Exibindo o elemento no topo
        System.out.println("Elemento no topo: " + pilha.peek());
    }
}

Saída Esperada

Pilha após push: [2.718, 1.618, 3.14]
Elemento removido: 2.718
Pilha após pop: [1.618, 3.14]
Elemento no topo: 1.618

Conclusão

As pilhas são estruturas de dados simples, porém poderosas, e a linguagem Java oferece várias maneiras de implementá-las. A escolha entre Stack, ArrayDeque e LinkedList depende das necessidades específicas do projeto e das operações de desempenho esperadas.


Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *