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.
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.
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.
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);
}
}