Localizar elemento na pilha

19 respostas
Fanpix

Como eu faço para buscar dados em uma pilha?

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?

Segue o código.

if (vOpcao == 2) { //Pesquisar por RA
				int Inicio = Topo;
				if (Topo == -1) { //verifica se a pilha está vazia
					System.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);
							}
						}
					}
				}
			}

19 Respostas

Rodrigo_Sasaki

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 :slight_smile: 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.

import java.util.Scanner;


public class Cadastro {

	public static void main(String[] args) {

		int vOpcao = 0, contador = 0;
		int Topo = -1; //a variável Topo vale -1 
		Aluno[] vetAlunos = new Aluno[1000];
		Scanner sc = new Scanner(System.in);

		do {
			System.out.println("-----------------");
			System.out.println("1 - Empilhar"); //ok
			System.out.println("2 - Pesquisar (RA)"); //só encontra se o cadastro estiver no topo
			System.out.println("3 - Contar Cadastrados"); 
			System.out.println("99 - Sair"); //ok
			System.out.println("-----------------");
			System.out.print("Digite a opção desejada: ");
			System.out.println("");
			vOpcao = sc.nextInt();

			if (vOpcao == 1) { //empilhar
				Aluno elem = new Aluno();
				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ência
				vetAlunos[Topo] = elem;
				System.out.print("Aluno empilhado com sucesso!! \n\n");
			} 

			else if (vOpcao == 2) { //Pesquisar por RA
				int Inicio = Topo;
				if (Topo == -1) { //verifica se a pilha está vazia
					System.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);
							}
						}
					}
				}
			}


			else if (vOpcao == 3) {//contar cadastrados
				int Inicio = 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();
	}
}

Classe Aluno:

public class Aluno {
	public int Ra;
	public String Nome;
	public Double Mensalidade;
}
Rodrigo_Sasaki

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?

else if (vOpcao == 2) { //Pesquisar por RA
				int Inicio = Topo;
				if (Topo == -1) { //verifica se a pilha está vazia
					System.out.println("Pilha vazia");
				} else {
					System.out.print("RA: ");
					int ra = sc.nextInt();
					for (Aluno aluno : vetAlunos) {
						if (aluno.equals(ra)) {
							System.out.println("Elemento encontrado!");
							System.out.println("RA CADASTRADO");
							System.out.println("RA: "+vetAlunos[Inicio].Ra);
							System.out.println("Nome: "+vetAlunos[Inicio].Nome);
							System.out.println("Mensalidade: "+vetAlunos[Inicio].Mensalidade);
						}
					}
				}
			}
Rodrigo_Sasaki

O objeto aluno não vai ser igual ao ra do aluno, ou pelo menos não deveria :slight_smile:

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

:slight_smile:

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.

else if (vOpcao == 2) { //Pesquisar por RA
				int Inicio = Topo;
				if (Topo == -1) { //verifica se a pilha está vazia
					System.out.println("Pilha vazia");
				} else {
					Aluno busca = new Aluno();
					System.out.print("RA: ");
					busca.Ra = sc.nextInt();
					for (Aluno aluno : vetAlunos) {
						if (busca.Ra.equals(aluno.Ra)) { //Esse está errado, eu sei. Mas é aqui que estou apanhando
							achou = true;
						}
					}
Rodrigo_Sasaki

Não tá errado não, está certo :slight_smile: 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

Criado 21 de novembro de 2013
Ultima resposta 22 de nov. de 2013
Respostas 19
Participantes 2