public void push(int i) {
top.dane = i;
top.next = top;
}
Załóżmy że dodajesz na początku push(1), wtedy top.dane = 1 oraz top.next.dane = null. Następnie dodajesz push(2). Wtedy top.dane = 2 oraz top.next.dane = top.dane = 2. A więc za każdym razem jak coś dodajesz to nadpisujesz dane poprzedniego elementu.
public void push(int i) {
Element old = top;
top.dane = i;
top.next = old;
}