Olá galera =) irei postar meu código sobre pilhas abaixo e queria que analisassem e dissessem o que acharam:
Classe com os método push e pop:
[code]import javax.swing.JOptionPane;
public class MetodosStack {
public String [] elemento=new String [10];
public String resultado="";
public int i;
public void push(int i){
for(i=0;i<10;i++){
this.elemento[i]=JOptionPane.showInputDialog("Digite"+" "+(i+1)+"º"+" elemento");
if( ((String)this.elemento[i]).isEmpty()){
JOptionPane.showMessageDialog(null,"O elemento não pode ser nulo");
System.exit(1);
}
}
for(i=10-1;i>=0;i--){
resultado=resultado+((i+1)+"["+this.elemento[i])+"]"+"\n";
JOptionPane.showMessageDialog(null,"Sua pilha está assim: "+"\n"+resultado);
}
}
public String pop() {
if(this.elemento[i].isEmpty()){
JOptionPane.showMessageDialog(null,"Adicione um elemento a pilha!!!");
}
for(i=10-1;i>=5;i--){
String resultado=" ";
resultado=resultado+"Removendo "+(i+1)+"º "+"elemento: "+"\n"+(i+1)+"["+(this.elemento[i])+"]"+"\n";
JOptionPane.showMessageDialog(null,"\n"+resultado);
}
for(i=5-1;i>=0;i--){
String resultado;
resultado=((i+1)+"["+this.elemento[i]+"]")+"\n";
JOptionPane.showMessageDialog(null,"Pilha atual: "+"\n"+resultado+"\n");
}
return resultado=" ";
}
}
[/code]
Classe principal:
[code]import javax.swing.JOptionPane;
public class PrincipalStack {
/**
* by:Robson Barreto
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MetodosStack stack= new MetodosStack();
int op=0;
do{
op=Integer.parseInt(JOptionPane.showInputDialog(“Selecione uma opção: “+”\n”+“1- Empilhar”+"\n"+“2-Desempilhar”));
switch(op){
case 1:stack.push(0);
break;
case 2:
JOptionPane.showMessageDialog(null,"\n"+stack.pop());
break;
}
}while(op!=0);
}
}[/code]
Obrigado !!!
bacana… mas… e qual é a sua duvida?
Analisei meio por cima.
Então, não faz muito sentido você ler os elementos/listar dentro da classe da pilha.
Segundo, sua pilha esta limitada a somente 10 elementos(a não ser que tenha sido de proposito)
Terceiro, não é legal ficar concatenando String desta forma
"Removendo "+(i+1)+"º "+"elemento: "+"\n"
Dê uma olhada em StringBuilder
Se quiser aprender mais sobre pilha, dê uma olhada na classe java.util.LinkedList (Não utiliza vetor, e sim uma lista ligada)
[quote=magostta]Analisei meio por cima.
Então, não faz muito sentido você ler os elementos/listar dentro da classe da pilha.
Segundo, sua pilha esta limitada a somente 10 elementos(a não ser que tenha sido de proposito)
Terceiro, não é legal ficar concatenando String desta forma
"Removendo "+(i+1)+"º "+"elemento: "+"\n"
Dê uma olhada em StringBuilder
Se quiser aprender mais sobre pilha, dê uma olhada na classe java.util.LinkedList (Não utiliza vetor, e sim uma lista ligada)
[/quote]
Cara valeu pelas dicas porém esse código foi feito para ter só 10 elementos mesmo, o propósito dele é mais didático, visto que foi feito como trabalho para explicar o conceito de pilha para a turma onde eu estudo !!!
java.teen,
Eu analisei e achei que não ficou boa a separação de responsabilidades entre as classes.
Explico: em projeto orientado a objetos, é importante que cada classe possua responsabilidades bem definidas. É o conceito de coesão.
Normalmente uma classe pilha fica responsável apenas por guardar os elementos da pilha, empilhar, desempilhar e gerenciar a pilha. Pode usar um vetor para isso.
Uma outra classe ficaria responsável por interagir com o usuário e manipular a pilha.
Também não é necessário empilhar todos os 10 elementos e desempilhar os 10 de uma vez. Pode ficar por conta do usuário empilhar ou desempilhar à vontade.
No tópico abaixo tem um exemplo muito bom de pilha, do Mantu (Luciano Mantuaneli). No construtor da classe SimpleStack você passa o número máximo de elmentos da pilha, que será o tamanho do vetor:
Tomei a liberdade de usar a classe SimpleStack do Mantu e criei um código que o usuário pode usar para empilhar e desempilhar. Rode e veja o que você acha:
[code]import javax.swing.*;
public class Main {
static SimpleStack pilha = new SimpleStack(10);
public static void main(String[] args) {
int op;
while(true){
String resposta = JOptionPane.showInputDialog(null, "Selecione uma opcao: \n"+
"1 - Empilhar\n"+
"2 - Desempilhar\n"+
"3 - Listar");
if(resposta == null) return;
try{
op = Integer.parseInt(resposta);
}catch(NumberFormatException e){
JOptionPane.showMessageDialog(null, "Opcao invalida.");
continue;
}
switch(op){
case 1:
empilhar();
break;
case 2:
desempilhar();
break;
case 3:
listar();
break;
}
}
}
private static void empilhar(){
String valor = JOptionPane.showInputDialog(null, "Digite o elemento a inserir na pilha: ");
valor = pilha.push(valor);
if(valor == null){
JOptionPane.showMessageDialog(null,"A pilha está cheia.");
}
}
private static void desempilhar(){
String valor = pilha.pop();
if(valor == null){
JOptionPane.showMessageDialog(null,"Não ha mais elementos na pilha.");
}else{
JOptionPane.showMessageDialog(null,"Desempilhado o elemento: "+valor);
}
}
private static void listar(){
JOptionPane.showMessageDialog(null, pilha.toString());
}
}[/code]
[code]/**
-
@author luciano.mantuaneli
-
@date 01/04/2008
*/
//package br.com.mantu.help.guj.zagaia.stack;
/**
[quote=al.barbosa]java.teen,
Eu analisei e achei que não ficou boa a separação de responsabilidades entre as classes.
Explico: em projeto orientado a objetos, é importante que cada classe possua responsabilidades bem definidas. É o conceito de coesão.
Normalmente uma classe pilha fica responsável apenas por guardar os elementos da pilha, empilhar, desempilhar e gerenciar a pilha. Pode usar um vetor para isso.
Uma outra classe ficaria responsável por interagir com o usuário e manipular a pilha.
Também não é necessário empilhar todos os 10 elementos e desempilhar os 10 de uma vez. Pode ficar por conta do usuário empilhar ou desempilhar à vontade.
No tópico abaixo tem um exemplo muito bom de pilha, do Mantu (Luciano Mantuaneli). No construtor da classe SimpleStack você passa o número máximo de elmentos da pilha, que será o tamanho do vetor:
Tomei a liberdade de usar a classe SimpleStack do Mantu e criei um código que o usuário pode usar para empilhar e desempilhar. Rode e veja o que você acha:
[code]import javax.swing.*;
public class Main {
static SimpleStack pilha = new SimpleStack(10);
public static void main(String[] args) {
int op;
while(true){
String resposta = JOptionPane.showInputDialog(null, "Selecione uma opcao: \n"+
"1 - Empilhar\n"+
"2 - Desempilhar\n"+
"3 - Listar");
if(resposta == null) return;
try{
op = Integer.parseInt(resposta);
}catch(NumberFormatException e){
JOptionPane.showMessageDialog(null, "Opcao invalida.");
continue;
}
switch(op){
case 1:
empilhar();
break;
case 2:
desempilhar();
break;
case 3:
listar();
break;
}
}
}
private static void empilhar(){
String valor = JOptionPane.showInputDialog(null, "Digite o elemento a inserir na pilha: ");
valor = pilha.push(valor);
if(valor == null){
JOptionPane.showMessageDialog(null,"A pilha está cheia.");
}
}
private static void desempilhar(){
String valor = pilha.pop();
if(valor == null){
JOptionPane.showMessageDialog(null,"Não ha mais elementos na pilha.");
}else{
JOptionPane.showMessageDialog(null,"Desempilhado o elemento: "+valor);
}
}
private static void listar(){
JOptionPane.showMessageDialog(null, pilha.toString());
}
}[/code]
[code]/**
-
@author luciano.mantuaneli
-
@date 01/04/2008
*/
//package br.com.mantu.help.guj.zagaia.stack;
/**
[/quote]
Entendi cara valeu pelos toques,essa ideia de deixar o usuário empilhar 1 elemento por exemplo e empilhar um outro depois(anulando o fato dele ter que fazer a pilha toda de uma vez) eu pensei também, porém minha apresentação é amanhã e fica muito em cima para mim fazer as alterações !!! Futuramente vou aprimorar mais o código. Valeu mesmo!
Uma versão mais simples e genérica.[code]public class Pilha {
private No<T> topo;
public void empilhar( T valor ) {
No<T> novoNo = new No<T>( valor );
novoNo.anterior = topo;
topo = novoNo;
}
// retorna null se a pilha estiver vazia
public T desempilhar() {
if ( !estaVazia() ) {
T valor = topo.valor;
topo = topo.anterior;
return valor;
}
return null;
}
// retorna null se a pilha estiver vazia
public T topo() {
if ( !estaVazia() ) {
return topo.valor;
}
return null;
}
public boolean estaVazia() {
return topo == null;
}
public void imprimir() {
No<T> atual = topo;
while ( atual != null ) {
System.out.println( atual.valor );
atual = atual.anterior;
}
}
public static void main( String[] args ) {
Pilha<String> p = new Pilha<String>();
p.imprimir();
p.empilhar( "Foo" );
p.empilhar( "Bar" );
p.empilhar( "David" );
p.imprimir();
System.out.println( "Desempilhou: " + p.desempilhar() );
p.imprimir();
}
private class No<T> {
T valor;
No<T> anterior;
No( T valor ) {
this.valor = valor;
}
}
}[/code]