Eu preciso pesquisar o código de um item em uma pilha, mas só estou conseguindo o retorno do resultado se o elemento estiver no topo.
Como eu faço para encontrar o elemento em qualquer posição da pilha?
Isso é uma operação meio incomum pra pilhas, tem certeza que uma pilha é a melhor opção?
De qualquer forma, você teria que iterar pela lista analisando todos os elementos. Que pilha você está utilizando?
Fanpix
Coisas de professor…
Não entendi.
Rodrigo_Sasaki
Você está implementando sua própria pilha? Ou está usando uma pilha que o Java fornece?
Fanpix
Pilha própria, infelizmente.
Rodrigo_Sasaki
Infelizmente não Isso faz ainda mais fácil.
Onde você armazena os elementos? É essa estrutura que você tem que percorrer
Fanpix
Segue o código mais completo:
Eu entendi como funciona uma pilha, mas só estou conseguindo passar isso para código com muita dificuldade.
importjava.util.Scanner;publicclassCadastro{publicstaticvoidmain(String[]args){intvOpcao=0,contador=0;intTopo=-1;//a variável Topo vale -1 Aluno[]vetAlunos=newAluno[1000];Scannersc=newScanner(System.in);do{System.out.println("-----------------");System.out.println("1 - Empilhar");//okSystem.out.println("2 - Pesquisar (RA)");//só encontra se o cadastro estiver no topoSystem.out.println("3 - Contar Cadastrados");System.out.println("99 - Sair");//okSystem.out.println("-----------------");System.out.print("Digite a opção desejada: ");System.out.println("");vOpcao=sc.nextInt();if(vOpcao==1){//empilharAlunoelem=newAluno();System.out.print("Digite o RA: ");elem.Ra=sc.nextInt();System.out.print("Digite o Nome: ");elem.Nome=sc.next();System.out.print("Digite o Mensalidade: ");elem.Mensalidade=sc.nextDouble();Topo=Topo+1;// variável topo servindo de referênciavetAlunos[Topo]=elem;System.out.print("Aluno empilhado com sucesso!! \n\n");}elseif(vOpcao==2){//Pesquisar por RAintInicio=Topo;if(Topo==-1){//verifica se a pilha está vaziaSystem.out.println("Pilha vazia");}else{System.out.print("RA: ");Inicio=sc.nextInt();if(vetAlunos[Topo].Ra==Inicio){System.out.println("RA CADASTRADO");System.out.println("RA: "+vetAlunos[Topo].Ra);System.out.println("Nome: "+vetAlunos[Topo].Nome);System.out.println("Mensalidade: "+vetAlunos[Topo].Mensalidade);for(Inicio=Topo;Inicio==Inicio-1;){if(Inicio!=vetAlunos[Topo].Ra){System.out.println("RA não localizado");}else{System.out.println("RA CADASTRADO");System.out.println("RA: "+vetAlunos[Topo].Ra);System.out.println("Nome: "+vetAlunos[Topo].Nome);System.out.println("Mensalidade: "+vetAlunos[Topo].Mensalidade);}}}}}elseif(vOpcao==3){//contar cadastradosintInicio=Topo;if(Inicio!=-1){contador++;}if(contador>0){System.out.println("Há "+contador+" aluno(s) cadastrado(s).");}else{System.out.println("Não há alunos cadastrados");}}if((vOpcao>3)&&(vOpcao!=99)||(vOpcao<1)){System.out.println("Opção inválida!!!");}else{if(vOpcao==99){System.out.println("Programa finalizado.");}}}while(vOpcao!=99);sc.close();}}
Simples, é só percorrer o vetAlunosfor(Aluno aluno : vetAlunos){
// verifique se é o elemento que você quer
}
Fanpix
Me desculpe pela ignorância, mas como eu implemento no código?
Como te falei, estou com dificuldade de entender esse código e estou esquentando a cabeça faz tempo por causa disso.
Depois que entender como ele funciona sei que ficará fácil, mas esse ainda não é o meu caso.
Rodrigo_Sasaki
Como assim? Você não quer saber se um elemento existe na pilha? É só verificar elemento a elemento se encontra o que quer.for(Aluno aluno : vetAlunos){
if(aluno.equals(elementoQueEuQuero){
System.out.println("Encontrei!");
}
}
Fanpix
Fiz assim e não deu certo. Pode me dizer onde estou errando?
O objeto aluno não vai ser igual ao ra do aluno, ou pelo menos não deveria
Fanpix
Ops! Verdade.
Como eu faço essa comparação do valor RA de aluno com o ra fornecido?
Acho que ainda não entendi muito bem o funcionamento do método equals.
Rodrigo_Sasaki
Fanpix
Eu tenho que criar um objeto que tenha as mesmas características da classe Aluno para conseguir fazer a comparação correto?
Mas como eu faço essa comparação?
Fanpix
Ok, entendi, mas a minha dúvida está em como eu faço para comparar o valor busca.Ra com o valor aluno.RA, como no código abaixo.
elseif(vOpcao==2){//Pesquisar por RAintInicio=Topo;if(Topo==-1){//verifica se a pilha está vaziaSystem.out.println("Pilha vazia");}else{Alunobusca=newAluno();System.out.print("RA: ");busca.Ra=sc.nextInt();for(Alunoaluno:vetAlunos){if(busca.Ra.equals(aluno.Ra)){//Esse está errado, eu sei. Mas é aqui que estou apanhandoachou=true;}}
Rodrigo_Sasaki
Não tá errado não, está certo O único problema aí é acessar direto o atributo. Seria melhor assim:if(busca.getRa().equals(aluno.getRa())
Fanpix
Quanto a isso tudo bem, já que não será usado em uma classe real.
Quanto ao comando, o eclipse não reconhece o comando dessa linha. O que eu posso fazer?
if(busca.Ra.equals(aluno.Ra)){// Erro: Cannot invoke equals(int) on the primitive type int
Rodrigo_Sasaki
Ah, como eles são tipos primitivos não possuem o método equals, aí compara com o operador de igualdade mesmo.if(busca.Ra == aluno.Ra)
Fanpix
Mas aí o eclipse devolve a mensagem de erro de NullPointerException