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");
}
}
Últimos comentários