package javacodebook.collections.stack;

import java.util.*;

/**
 * Eine Implementierung eines Stapelspeichers.
 */
public class RealStack {

    private ArrayList dataArray;

    /** Erzeugt einen leeren Stapelspeicher. */
    public RealStack() {
        dataArray = new ArrayList();
    }

    /** Überprüft, ob der Stapel leer ist. */
    public boolean empty() {
        return dataArray.isEmpty();
    }

    /** Gibt das oberste Element vom Stapel zurück, ohne es zu entfernen. */
    public Object peek() {
        if(dataArray.isEmpty())
            throw new EmptyStackException();
        return dataArray.get(dataArray.size()-1);
    }

    /** Gibt das oberste Element zurück und entfernt es vom Stapel. */
    public Object pop() {
        if(dataArray.isEmpty())
            throw new EmptyStackException();
        Object o = dataArray.get(dataArray.size()-1);
        dataArray.remove(dataArray.size() -1);
        return o;
    }

    /** Legt ein Objekt oben auf dem Stapel ab. */
    public Object push(Object item) {
        dataArray.add(item);
        return item;
    }

    /** Sucht ein Objekt im Stapel. Als Rückgabewert wird seine Position
     *  zurückgegeben, oder -1, wenn das Objekt nicht gefunden wurde.
     *  Die Zählung beginnt bei 1 für das oberste Element und wird hochgezählt,
     *  je tiefer das Objekt im Stapel liegt.
     */
    public int search(Object o) {
        for(int i = dataArray.size()-1; i >= 0; i--) {
            if(o.equals(dataArray.get(i)))
                return dataArray.size() - i;
        }
        return -1;
    }

    /** Gibt die Anzahl der Elemente im Stapel zurück. */
    public int size() {
        return dataArray.size();
    }
}
