La pila è ovviamente vuota perchè l'istruzione return è inserita prima di riaggiungere l'elemento alla pila stessa.
L'istruzione return termina il metodo e qualunque istruzione posta dopo viene semplicemente ignorata (è come se non esistesse).
Ti serve una variabile d'appoggio in cui inserire il ritultato della chiamata successiva:
codice:
public static int metodo(intArrayStack p,int x) {
int result = 0;
if(p.isEmpty()) {
result = 0;
} else {
int i=p.peek();
p.pop();
if(i==x) result = 1+metodo(p,x);
if(i!=x) result = metodo(p,x);
p.push(i);
}
return retult;
}
Ricorda che è buona norma utilizzare una sola volta l'istruzione return, sempre alla fine del metodo per evitare errori semantici come questo.
Ciao.