Metodo push e pop

Senhores boa tarde.

Peço ajuda pois cheguei onde podia mas agora é hora de gritar…
Bom, foi solicitado na faculdade o seguinte exercicio:

Elabore um programa para testarmos os conceitos de pilhas, para tanto, crie sua própria pilha (não é válido utilizar a classe Stack apresentada em sala de aula).
Sua pilha deve ser capaz de armazenar apenas objetos do tipo Cachorro e as seguintes regras devem ser respeitadas:

  • Sua pilha não deve aceitar que cachorros mais pesados sejam dispostos sobre cachorros mais leves.
  • Um cachorro menos agressivo não pode ser alocado sobre um mais agressivo. Níveis iguais de agressividade são aceitos.
    A primeira regra é absoluta, a menos que o cachorro mais pesado que foi alocado sobre um menos pesado possua o dobro de sua agressividade.
    Teste sua pilha.

Implemente os métodos PUSH e POP de sua pilha.
Ambos os métodos dever exibir uma mensagem para o usuário dizendo o nome do cachorro, o tipo de pêlo que possui e a ação realizada com ele (adicionado ou removido da pilha).

Criei 03 classes : Cachorro, Pilha e Principal.
Na classe Principal falta colocar algo conforme o nome da classe, o principal.
Não sei como realizar as validações para que as regras aconteçam de forma que o enunciado pede.

Desde já agradeço a todos pelas respostas.


class Cachorro {

    String nome;
    double peso;
    boolean possuirCabelos = true;
    int nivelDeAgressividade = 0;

    public int getNivelDeAgressividade() {
        return nivelDeAgressividade;
    }

    public void setNivelDeAgressividade(int nivelDeAgressividade) {
        this.nivelDeAgressividade = nivelDeAgressividade;
    }

    public void setPeso(double peso) {
        this.peso = peso;
    }

    public double getPeso() {
        return peso;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setPossuirCabelos(boolean possuirCabelos) {
        this.possuirCabelos = possuirCabelos;
    }

    public boolean isPossuirCabelos() {
        return possuirCabelos;
    }

}
public class pilha {

    Cachorro[] caes = new Cachorro[100];
    int posicaoVaga;
    Cachorro c = new Cachorro();

    public void push(Cachorro cao) {
       /* Validacoes !!!!!! */
        caes[posicaoVaga] = cao;
        posicaoVaga++;
    }

    public void pop (Cachorro cao) {

    }
}

public class Principal {

    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        pilha pilhaDeCachorros = new pilha();
        int resp = 0;
        do{
            Cachorro dog = new Cachorro();
            System.out.println("Digite o nome do vira-latas:");
            dog.setNome(teclado.next());
            System.out.println("Digite o peso do cao:");
            dog.setPeso( teclado.nextDouble());
            System.out.println("Digite o nível de agressividade do cao:");
            dog.setNivelDeAgressividade( teclado.nextInt() );
            System.out.println("Digite sim/nao se o cao possui ou não cabelos");
            String resposta = teclado.next();
            dog.setPossuirCabelos( resposta.equals("sim") );
            System.out.println("Digite 1 para por o cachorro na pilha"
                    + "                2 para tirar um cachorro da pilha"
                    + "                3 para sair");
            resp = teclado.nextInt();

            pilhaDeCachorros.push(dog);

            pilhaDeCachorros.pop(dog);
            
        } while (resp!=3);
        


    }

}