package javacodebook.collections.queue;

import java.util.*;

/**
 *  Eine einfache Warteschlange, die als interne Datenstruktur eine LinkedList
 *  verwendet, in der Elemente ans Ende angefügt und am Anfang entnommen werden.
 */
public class Queue {

    protected LinkedList queue;

    /** Erzeugt eine leere Warteschlange mit variabler Größe */
    public Queue() {
        queue = new LinkedList();
    }

    /** Fügt ein Element ans Ende der Warteschlange ein */
    public void insert(Object item) {
        queue.addLast(item);
    }

    /** Entfernt ein Elment vom Anfang der Warteschlange und gibt es zurück */
    public Object remove() {
        if(isEmpty())
            throw new EmptyQueueException();
        Object o = queue.removeFirst();
        return o;
    }

    /** Gibt das Erste Element am Anfang der Warteschlange zurück, ohne es zu
     *  entfernen.
     */
    public Object peek() {
        if(isEmpty())
            throw new EmptyQueueException();
        return queue.getFirst();
    }

    /** Überprüft, ob die Warteschlange Elemente enthält. */
    public boolean isEmpty() {
        return queue.size() == 0;
    }

    /** Gibt die Anzahl der Elemente in der Warteschlange zurück */
    public int size() {
        return queue.size();
    }

}
