Startseite < Informatik < Algorithmen Datenstrukturen < [ DRUCK , 2004 , 2005 , 2006 , 2007 , 2008 , 2009 ] Stack Queue Tree > / Software-Engineering / Programmiersprachen / Künstliche Intelligenz > Schach Privates / Inhalt >
Stack
Eine listenähnliche Datenstruktur mit dem LIFO-Prinzip heißt Stack oder Keller.
Einführung Theorie: Stack
Definition
Der Stack, auch Keller genannt, ist eine listenähnliche Datenstruktur, in die nur an einem Ende (top) eingefügt (push) oder gelöscht (pop) werden kann — ganz nach dem LIFO-Prinzip: Last In, First Out!
Mögliche Schnittstelle: Stack
interface Stack {

  /* Prüft, ob der Stack leer ist. */
  public boolean isEmpty();

  /* Fügt ein neues (top-) Element an. */
  public void push(Object element);

  /* Löscht das top-Element heraus und gibt es zurück. */
  public Object pop();
}
Beispiel
Das LIFO-Prinzip ist keine Seltenheit und tritt in aller Regel dann auf, wenn etwas gestapelt werden muss. Ein Tellerstapel ist sozusagen ein Stack. Benötigt man einen Teller, dann nimmt man den obersten Teller vom Stapel (pop). Nach Gebrauch spült man den Teller wieder ab und legt ihn wieder oben auf (push).
Implementierung Implementierung: Stack
Häufig realisiert man den Stack mit einer einfach verketteten Liste. Die Java-Implementierer freuen sich über die leichte Realisierung des Stack mit der bereits vorhandenen Klasse LinkedList.
Realisierung des Stack mittels LinkedList
import java.util.LinkedList;

public class LinkedListStack implements Stack {

  private LinkedList buffer;

  public LinkedListStack() {
    this.buffer = new LinkedList();
  }

  public boolean isEmpty() {
    return (this.buffer.size() <= 0);
  }

  public void push(Object element) {
    this.buffer.addFirst(element);
  }

  public Object pop() {
    return this.buffer.removeFirst();
  }
}
Als Alternative zu LinkedList kann der Stack auch mit einem Array realisiert werden.
Realisierung des Stack mittels Array
public class ArrayStack implements Stack {

  private Object[] buffer;
  private int indexOfTop;

  public ArrayStack() {
    this.buffer = new Object[10]; // Array der Länge 10
    this.indexOfTop = -1; // noch keine Elemente in Puffer
  }

  public boolean isEmpty() {
    return (this.indexOfTop < 0);
  }

  public void push(Object element) {
    this.indexOfTop++;

    // ggf. Array-Länge verdoppeln
    if (this.indexOfTop >= this.buffer.length) {
      Object[] redouble = new Object[2 * this.buffer.length];
      System.arraycopy(this.buffer, 0, redouble, 0, this.buffer.length);
      this.buffer = redouble;
    }

    this.buffer[this.indexOfTop] = element;
  }

  public Object pop() {
    if (this.isEmpty()) return null;
    else {
      Object top = this.buffer[this.indexOfTop];
      this.buffer[this.indexOfTop] = null;
      this.indexOfTop--;
      return top;
    }
  }
}
Als Alternative zu LinkedList oder Array kann der Stack auch mit einem Vector realisiert werden.
Realisierung des Stack mittels Vector
import java.util.Vector;

public class VectorStack implements Stack {

  private Vector buffer;

  public VectorStack() {
    this.buffer = new Vector();
  }

  public boolean isEmpty() {
    return this.buffer.isEmpty();
  }

  public void push(Object element) {
    this.buffer.ensureCapacity(this.buffer.size() + 1);
    this.buffer.add(0, element);
  }

  public Object pop() {
    if (this.buffer.isEmpty()) return null;
    else return this.buffer.remove(0);
  }
}