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"); } }
janeiro 21st, 2012 on 10:49
Oi Tiago…. Vc está de parabéns…. Acabou de me salvar…
abril 24th, 2012 on 07:54
Obrigado Tiago Passos, começei a estudar java agora e nunca tinha ouvido falar sobre pilhas, analisei seu codigo com calma e li sobre pilhas de outras fontes e agora ja estou fazendo uso das principais funcões dela ;D
[]’s
abril 13th, 2015 on 20:41
Mto legal seu exemplo 🙂
novembro 20th, 2015 on 13:30
Parabéns, eu consegui entender melhor o sistema LIFO com seu códiogo… Sucesso…..