As pilhas são estruturas baseadas no princípio LIFO (last in, first out), na qual os dados que foram inseridos por último na pilha serão os primeiros a serem removidos. Existem duas funções que se aplicam a todas as pilhas: PUSH, que insere um dado no topo da pilha, e PULL, que remove o item no topo da pilha.

Neste artigo coloco um exemplo de aplicação de pilha. Trata-se de uma sacola de correspondências, onde deve se colocar um número limite para poder inserir, remover, retornar o ítem que está no topo etc. No exemplo utilizaremos o método POP, ao invés de PULL para remover um ítem do topo da pilha. Usaremos a biblioteca JOptionPane para ilustrar melhor o exemplo.

Você deve compilar o arquivo CartaApp para poder visualizar o exemplo funcionando.

Aqui vai a descrição do problema:

Faça um programa, em Java, que implemente as tarefas de um entregador de correspondências postais. Leve em consideração que as correspondências são empilhadas na sacola e devem ser entregues levando-se sempre em consideração a que encontra-se no topo. O programa deve permitir:

– Inserir correspondência na sacola (empilhar);
– Remover correspondência da sacola (desempilhar);
– Verificar se a sacola está cheia ou vazia;
– Verificar a próxima correspondência a ser entregue;
– Informar quantas correspondências existem na sacola.

A pilha deverá armazenar objetos com os dados de cada correspondência

Se preferir, baixe os arquivos aqui.

StackX.java

//StackX.java

/**
 * Essa é a classe principal, onde temos todos os métodos para inserir,
 * remover, retornar os dados etc.
 */
class StackX {
       private int maxSize;        // tamanho do array (vetor)
       private Carta[] stackArray;
       private int top;            // topo da pilha
    //--------------------------------------------------------------
       public StackX(int s)         // construtor
          {
          maxSize = s;             // define tamanho do array
          stackArray = new Carta[maxSize];  // cria array
          top = -1;                // sem itens
          }
    //--------------------------------------------------------------
       public void push(Carta stackAux)    // coloca no topo da pilha
          {
          stackArray[++top] = stackAux;     // incrementa topo, insere item
          }
    //--------------------------------------------------------------
       public Carta pop()           // tira item do topo da pilha
          {
          return stackArray[top--];  // acessa o item, decrementa o topo
          }
    //--------------------------------------------------------------
       public Carta peek()          // retorna o item do topo da pilha
          {
          return stackArray[top];
          }
    //--------------------------------------------------------------
       public boolean isEmpty()    // retorna true se a pilha estiver vazia
          {
          return (top == -1);
          }
    //--------------------------------------------------------------
       public boolean isFull()     // retorna true se a pilha estiver cheia
          {
          return (top == maxSize-1);
          }
    public int getTop() {
        return top;
    }

}

Carta.java

//Carta.java
/**
 * Nessa classe estão todos os atributos do objeto
 */
public class Carta {

    private String nome; // nome do remetente
    private String logra; // nome do logradouro
    private int num; // numero do lugradourou

    public Carta(String nome,String logra,int num) {

        this.nome = nome;
        this.logra = logra;
        this.num = num;

    }

    public String displayCarta() {

        return ("Remetente: "+nome+
                "\nLogradouro: "+logra+", "+num);

    }

    public String getNome() {
        return nome;
    }

}

CartaApp.java

//CartaApp.java
//Aplicação que deve ser compilada
import javax.swing.JOptionPane;

/**
 * Faça um programa, em Java, que implemente as tarefas de
 * um entregador de correspondências postais. Leve em
 * consideração que as correspondências são empilhadas na
 * sacola e devem ser entregues levando-se sempre em
 * consideração a que encontra-se no topo. O programa
 * deve permitir:
 *
 * - Inserir correspondência na sacola (empilhar);
 * - Remover correspondência da sacola (desempilhar);
 * - Verificar se a sacola está cheia ou vazia;
 * - Verificar a próxima correspondência a ser entregue;
 * - Informar quantas correspondências existem na sacola.
 *
 * A pilha deverá armazenar objetos com os dados de cada correspondência
 *
 * @author Tiago Passos - http://tiagopassos.com)
 *
 */

public class CartaApp {

    public static void main(String[] args) {

        StackX Pilha = new StackX(Integer.parseInt(JOptionPane
                .showInputDialog("Quantas cartas deseja colocar na sacola:")));
        Carta temp; // Declara variavel temporaria

        int op = Integer.parseInt(JOptionPane.showInputDialog("MENU"
                + "\n1 - Inserir correspondência na sacola"
                + "\n2 - Remover correspondência da sacola"
                + "\n3 - Verificar se a sacola está cheia ou vazia"
                + "\n4 - Verificar a próxima correspondência a ser entregue"
                + "\n5 - Informar quantas correspondências existem na sacola"
                + "\n6 - Sair" + "\n\nDigite a opção desejada:"));

        while (op != 6){

            if (op == 1) {

                // INSERE
                String nome = JOptionPane
                        .showInputDialog("Digite o nome do remetente:");
                String logra = JOptionPane
                        .showInputDialog("Digite o nome do logradouro:");
                int num = Integer.parseInt(JOptionPane
                        .showInputDialog("Digite o numero:"));

                Carta cartaAux = new Carta(nome, logra, num);

                if (!Pilha.isFull()) {

                    Pilha.push(cartaAux);
                    JOptionPane.showMessageDialog(null,
                            "Carta colocada na sacola");

                } else {

                    JOptionPane.showMessageDialog(null,
                            "Desculpe. A sacola está cheia");

                }

            }

            else if (op == 2) {

                // REMOVE CORRESPONDECIA DA SACOLA
                if (!Pilha.isEmpty()) {

                    temp = Pilha.pop();
                    JOptionPane.showMessageDialog(null, "Carta removida:\n"
                            + temp.displayCarta());
                    temp.displayCarta();

                } else {

                    JOptionPane.showMessageDialog(null, "A sacola está vazia");

                }

            }

            else if (op == 3) {

                // REMOVE CORRESPONDECIA DA SACOLA
                if (Pilha.isEmpty()) {

                    JOptionPane.showMessageDialog(null, "A sacola está vazia");

                } else if (Pilha.isFull()) {

                    JOptionPane.showMessageDialog(null, "A sacola está cheia");

                } else {

                    int qtd_cartas = Pilha.getTop();
                    qtd_cartas++;
                    JOptionPane.showMessageDialog(null,
                            "A sacola não está cheia nem vazia. " + "Possui "
                                    + qtd_cartas + " carta(s)");

                }

            }

            else if (op == 4) {

                // VERIFICA A PROXIMA CARTA A SER ENTREGUE

                if (!Pilha.isEmpty()) { // VERIFICA SE A PILHA ESTA VAZIA

                    temp = Pilha.peek();
                    JOptionPane.showMessageDialog(null,
                            "Próxima carta a ser entregue:\n"
                                    + temp.displayCarta());

                } else {

                    JOptionPane.showMessageDialog(null,
                            "Não foi cadastrada nenhuma carta");

                }

            }

            else if (op == 5) {

                // INFORMA QUANTAS CARTAS EXISTEM NA SACOLA
                // getTop informa o ultimo indice inserido
                // A contagem começa de 0, por isso soma 1
                int qtd_cartas = Pilha.getTop();
                qtd_cartas++;
                JOptionPane.showMessageDialog(null,
                        "Quantidade de cartas na sacola: " + qtd_cartas);

            }

            op = Integer
                    .parseInt(JOptionPane
                            .showInputDialog("MENU"
                                    + "\n1 - Inserir correspondência na sacola"
                                    + "\n2 - Remover correspondência da sacola"
                                    + "\n3 - Verificar se a sacola está cheia ou vazia"
                                    + "\n4 - Verificar a próxima correspondência a ser entregue"
                                    + "\n5 - Informar quantas correspondências existem na sacola"
                                    + "\n6 - Sair"
                                    + "\n\nDigite a opção desejada:"));

            }

            JOptionPane.showMessageDialog(null, "Você saiu do programa");

        }

    }