Ajuda no programa usando pilha em java

Uma empilhadeira carrega caixas de 7, 5, 3 toneladas. Há três pilhas A, B, C. A pilha A é onde se
encontram todas as caixas que chegam no depósito. Com um detalhe: caixas maiores não podem ser
empilhadas sobre caixas menores. Elabore um programa que efetue o controle das caixas, de forma
que caso uma caixa de maior peso do que uma que já está em A deva ser empilhada, então, todas as
caixas que estão em A são movidas para as pilhas auxiliares B (contendo somente caixa de 5
toneladas) e C (contendo somente caixas de 3 toneladas) até que se possa empilhar a nova caixa.
Depois, todas as caixas são movidas de volta para a pilha A.

Tenho que resolver esse problema, mas esta dando NullPointerException no meu programa(talvez esteja muito errado). Alguem pode me dizer o que modificar dar algumas dicas?
public class Sistema {

public static void main(String[] args) {
	Caixa a = new Caixa(3);
	Caixa b = new Caixa(3);
	Caixa c = new Caixa(7);
	Caixa d = new Caixa(5);
	Caixa e = new Caixa(7);
	
	Empilha emp = new Empilha();
	emp.empilhar(a);
	emp.empilhar(b);
	emp.empilhar(c);
	emp.empilhar(d);
	emp.empilhar(e);
	
	//emp.imprimir();
}

}

public class Empilha {
Pilha A = new Pilha();
Pilha B = new Pilha();
Pilha C = new Pilha();

public void empilhar(Caixa caixa) {
	if(A.tamanho() > 0) {
		if(caixa.getPeso() > A.getCaixa().getPeso()) {
			this.Desempilhar(caixa);
		}
		if(caixa.getPeso() == 7)
			A.addInicio(caixa);
		else if(caixa.getPeso() == 5) {
			A.addInicio(caixa);
			while(B.tamanho() > 0) {
				A.addInicio(B.getCaixa());
				B.removerInicio();
			}
		}
		else{
			A.addInicio(caixa);
			while(C.tamanho() > 0) {
				A.addInicio(caixa);
				C.removerInicio();
			}
		}
	}
}

public void Desempilhar(Caixa caixa) {
	while(A.getCaixa().getPeso() == 3) {
		C.addInicio(A.getCaixa());
		A.removerInicio();
	}
	while(A.getCaixa().getPeso() == 5) {
			B.addInicio(A.getCaixa());
			A.removerInicio();
	}
}

public void imprimir() {
	A.imprimir();
}

}

public class Caixa {
private int peso;

public Caixa() {
	
}

public Caixa(int peso) {
	this.setPeso(peso);
}

public int getPeso() {
	return peso;
}

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

}

public class Pilha {
private No inicio;
private int tam;
private int add;

public void addInicio(Caixa caixa) {	//correto
	No no = new No();
	no.setCaixa(caixa);
	no.setProx(inicio);
	inicio = no;
	tam++;
}

public void removerInicio() {	//correto
	if(tam > 0) {
		inicio = inicio.getProx();
		tam--;
	}
}

public Caixa getCaixa() {
	return inicio.getCaixa();
}


public void imprimir() {	//correto
	No aux = inicio;
	System.out.println(aux.getCaixa().getPeso());
	while(aux.getProx() != null) {
		aux = aux.getProx();
		System.out.println(aux.getCaixa().getPeso());
	}
}

public int tamanho() {
	return tam;
}

}

Olá Carlos_Alexandre1,

Identifiquei que seu código de empilhar tem uma condição de somente realizar o empilhamento caso sua pilha A tenha o tam>0, como ela não foi inicializada, você nunca terá nenhuma caixa empilhada, gerando assim NullPointerException no seu código de imprimir.
Mas acredito que isso ainda não resolverá sua questão de empilhar, se me permitir, gostaria de lhe dar dicas a respeito do seu algorítimo. Tente fazer, caso não consiga me avise, que posto o código do seu algorítmo funcionando.

  1. Tente simplicar ao másimo possível, ou seja, crie uma função somente para um determinado assunto, exemplo: “desempilharPilhaAParaPilhaC”, “desempilharPilhaAParaPilhaB”, “empilharCEmA”, “empinharBEmA” etc…
    Fazendo desta forma, fica mais fácil entender passo a passo o que o algorítimo precisa fazer a cada chamada para empilhar;
    2)Realizar testes de mesa durante a construção do algorítimo pode lhe ajudar bastante a entender o problema;
    3)Debugar é fundamental em qualquer construção de algorítimos, a maior parte das vezes em que implementamos algo, não irá funcionar como o desejado de primeira;
  2. O exercício lhe dá uma dica importantíssima sobre como resolver o problema de empilhar na sequencia de pesos maiores embaixo de caixas com pesos menores; " todas as
    caixas que estão em A são movidas para as pilhas auxiliares B (contendo somente caixa de 5
    toneladas) e C (contendo somente caixas de 3 toneladas) até que se possa empilhar a nova caixa.";
  3. Deixe o inicio da pilha somente com pesos igual a 7.
1 curtida

Obrigado Tercio, vou utilizar suas dicas e tentar resolver.

Pôxa, nem chegou a pensar em como resolver o problema?
Sempre que encontrar um (, você empilha, sempre que encontrar um ), você desempilha.
Se ao final do processo a pilha estiver vazia, é porque a expressão é bem formada.

Abra um tópico para sua dúvida. Pare de poluir o tópico dos outros.

1 curtida

Obrigado novamente Tercio. Problema resolvido, suas dicas ajudaram.

Por nada amigo!