Intercalar Pilhas

4 respostas
Denise_sbs

Tenho um exercício sobre pilhas. Devo criar um aplicativo com menu, adicionar notas, excluir notas. As notas serão divididas em duas pilhas uma para meninos outra para meninas. Devo ainda formar uma terceira pilha, com as notas intercaladas, ou seja, uma nota de meninos, depois uma nota de meninas, depois meninos de novo e assim sucessivamente até que ambas estejam nulas. Depois devo imprimir, as três pilhas. Consegui os métodos de inclusão, exclusão e impressão. Mas, para juntar as pilhas, fiz apenas um método que recebe de uma pilha e depois de outra pilha. Mas os valores são seguidos, todas as notas de uma pilha e depois todas as notas da outra pilha. Alguém pode me ajudar? Essa é minha classe com os métodos.

package Pilhas;

public class Pilha {

    private No_pilha topo1 = null;
    private No_pilha topo2 = null;
    private No_pilha topo = null;
    J_Leitura in = new J_Leitura();//classe que lê minhas entradas de dados via teclado

    void push (char sexo){//método de inclusão

        No_pilha temp = new No_pilha();//crio um novo objeto do tipo no_pilha com sexo, nota e prox
        if (temp != null){

            System.out.println ("Digite nota: ");//recebo os dados
            temp.nota = in.Ler_float();
            temp.sexo = sexo;

            if (sexo == 'M'){
                temp.prox = topo1;
                topo1 = temp;
            }
            else {
                temp.prox = topo2;
                topo2 = temp;
            }
        }
        else {
            System.out.println ("Não é possível adicionar");
            in.Pause(2);
        }
    }

    void pop (char sexo){//método de exclusão

        if (topo1 != null && sexo == 'M'){
            System.out.println ("Confirmada exclusão da nota");
            topo1 = topo1.prox;
            in.Pause(2);
            return;
        }
        else {
            System.out.println ("Pilha vazia");
        }
        if (topo2 != null && sexo == 'F'){
            System.out.println ("Confirmada exclusão da nota");
            topo2 = topo2.prox;
            in.Pause(2);
            return;
        }
        else {
            System.out.println ("Pilha vazia");
        }
    }

    private void concatenar (){//método para juntar as pilhas em uma só
    topo = null;

    conc (topo1);
    conc (topo2);

    }

    private void conc (No_pilha topo){

        if (topo == null){
            return;
        }
        while (topo != null){
            No_pilha temp = new No_pilha();
            if (temp != null){
                temp.nota = topo.nota;
                temp.sexo = topo.sexo;
                temp.prox = this.topo;
                this.topo = temp;
                topo = topo.prox;
            }
        }
    }
    
    void imprimir (){//imprimindo as pilhas
        concatenar ();

        if (topo == null){
            System.out.println ("Pilhas vazias");
            return;
        }

        if (topo1 != null){
            System.out.println ("Notas dos meninos");
            imp (topo1);
        }
         if (topo2 != null){
            System.out.println ("Notas das meninas");
            imp (topo2);
        }
        System.out.println ("Notas Gerais");
        imp (topo);
            
    }

            private void imp (No_pilha topo){

                while (topo != null){
                System.out.println ("\n" + topo.nota + " ' " + topo.sexo + "'");
                topo = topo.prox;
                in.Pause(2);

    }
    }

}

Agradeço aos que puderem me dar uma ajuda.

4 Respostas

fernandosavio

Tu está chamando:

conc(pilha1);
conc(pilha2);

Acho que tu deveria fazer um método como:

intercala(pilha1, pilha2);

Assim se tem acesso às duas pilhas ao mesmo tempo…
Do jeito que você fez só analisa uma de cada vez…

Denise_sbs

Fiz assim o método, não sei onde está o erro.

private void intercalar (No_pilha topo1, No_pilha topo2){

            while (topo1 != null && topo2 != null){

            No_pilha temp = new No_pilha();
            
            if (temp != null){
                temp.nota = topo1.nota;
                temp.sexo = topo1.sexo;
                temp.prox = this.topo;
                this.topo = temp;
                temp.nota = topo2.nota;
                temp.sexo = topo2.sexo;
                temp.prox = this.topo;
                this.topo = temp;
              }
        }
    }
fernandosavio

Eu também não sei onde está o erro Denise_sbs
Poste o erro junto para podermos te ajudar…

fernandosavio
temp.nota = topo1.nota;  
temp.sexo = topo1.sexo;  

//temp.prox não deveria ser null? pois é o último da pilha
temp.prox = this.topo;  

//this.topo.prox deveria ser temp.. assim ele apontaria para o último da pilha...
this.topo = temp;

Dá uma olhada na tua lógica…

Criado 25 de setembro de 2011
Ultima resposta 26 de set. de 2011
Respostas 4
Participantes 2