Localizar elemento na pilha

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);
							}
						}
					}
				}
			}

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?

Coisas de professor…

Não entendi.

Você está implementando sua própria pilha? Ou está usando uma pilha que o Java fornece?

Pilha própria, infelizmente.

Infelizmente não :slight_smile: Isso faz ainda mais fácil.

Onde você armazena os elementos? É essa estrutura que você tem que percorrer

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;
}

Simples, é só percorrer o vetAlunosfor(Aluno aluno : vetAlunos){ // verifique se é o elemento que você quer }

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.

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!"); } }

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);
						}
					}
				}
			}

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

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.

:slight_smile:

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?

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;
						}
					}

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())

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

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)

Mas aí o eclipse devolve a mensagem de erro de NullPointerException