import java.util.Iterator;

public class LinkedStack {

    // nasz statyczny interfejs składowy
    public interface Linkable {
        public Linkable getNext();
        public void setNext(Linkable node);
    }

    // początek listy
    private Linkable head;

    // treść metod pominięto
    public void push(Linkable node) { ... }
    public Linkable pop() { ... }

    // Ta metoda zwraca obiekt typu Iterator dla tej klasy LinkedStack.
    public Iterator<Linkable> iterator() { return new LinkedIterator(); }

    // To jest implementacja interfejsu Iterator,
    // zdefiniowana jako niestatyczna klasa składowa.
    protected class LinkedIterator implements Iterator<Linkable> {
        Linkable current;

        // W konstruktorze użyto prywatnego pola klasy nadrzędnej.
        public LinkedIterator() { current = head; }

        // Trzy poniższe metody są zdefiniowane przez interfejs Iterator.
        public boolean hasNext() { return current != null; }

        public Linkable next() {
            if (current == null)
                throw new java.util.NoSuchElementException();
            Linkable value = current;
            current = current.getNext();
            return value;
        }

        public void remove() { throw new UnsupportedOperationException(); }
    }
}
