© APSIS GmbH
, Polling,
2000
Polymorphe Implementierung der Schnittstelle Stapel aus der Bibliothek für das Lehrbuch Programmieren mit Java
Dokumentation
Programmtext ohne Dokumentation
/* * @(#)kapitel9/StapelPol.java * Bibliothek für das Lehrbuch in Java * @author Prof. Solymosi, (c): APSIS GmbH * @version 3.0 * @date 28. August 2000 */ package lehrbuch.kapitel9;
/** Polymorphe Implementierung des Stapels als Reihung */
public class StapelPol implements lehrbuch.kapitel9.Stapel {
// aus (9.12) und (10.24)
/** Konstruktor.
@param groesse const maximale Anzahl der einzutragenden Elementen
*/
public StapelPol(final int groesse) {
inhalt = new Object[groesse];
entleeren();
}
/** Kopierkonstruktor.
@param quelle const der zu kopierende Stapel
@exception VollAusnahme der kopierte Stapel kann wegen Speichermangel nicht erstellt werden
*/
public StapelPol(final StapelPol quelle) throws VollAusnahme {
this(quelle.inhalt.length);
kopieren(quelle);
}
/** entleert den Stapel */
public void entleeren() { // ensures istLeer();
spitze = -1;
}
/** Trägt ein Element in den Stapel ein.
@param element const das einzutragende Objekt
@exception VollAusnahme das Objekt kann nicht mehr eingetragen werden
@see StapelPol#istVoll
*/
public void eintragen(final Object element) throws VollAusnahme {
try {
spitze++; // nächster freier Platz
inhalt[spitze] = element; // throws IndexOutOfBoundsException, wenn spitze = inhalt.length
} catch(IndexOutOfBoundsException ausnahme) {
spitze--; // zurücksetzen
throw new VollAusnahme();
}
}
/** Gibt das jüngste Element aus dem Stapel.
const
@return das jüngste Element im Stapel
@exception LeerAusnahme es gibt kein Objekt im Stapel
@see StapelPol#istLeer
*/
public Object lesen() throws LeerAusnahme { // requires !istLeer()
try {
return inhalt[spitze]; // letztes eingetragenes Element
// throws IndexOutOfBoundsException, wenn spitze = -1
} catch(IndexOutOfBoundsException ausnahme) {
throw new LeerAusnahme();
}
}
/** Entfernt das jüngste Element aus dem Stapel.
@exception LeerAusnahme es gibt kein Objekt im Stapel
@see StapelPol#istLeer
*/
public void entfernen() throws LeerAusnahme {
try {
attrappe = inhalt[spitze]; // throws IndexOutOfBoundsException, wenn spitze = -1
spitze--; // Platz des letzten eingetragenen Elements freigeben
} catch(IndexOutOfBoundsException ausnahme) {
throw new LeerAusnahme();
}
}
private static Object attrappe; // global, damit der Compiler es nicht wegoptimiert
/** Überprüft ob der Stapel leer ist.
Wenn false, LeerAusnahme wird nicht ausgelöst.
const
@return true wenn der Stapel leer ist
@see StapelPol#lesen
@see StapelPol#entfernen
*/
public boolean istLeer() {
return spitze == -1;
}
/** Überprüft ob der Stapel voll ist.
const
Wenn false, VollAusnahme wird nicht ausgelöst.
@return true wenn der Stapel voll ist
@see StapelPol#eintragen
*/
public boolean istVoll() {
return spitze == inhalt.length-1;
}
/** Kopiert Inhalt des Stapels.
@param quelle const der zu kopierende Stapel
@exception VollAusnahme der kopierte Stapel kann wegen Speichermangel nicht erstellt werden
*/
public void kopieren(final Stapel quelle) throws VollAusnahme {
try {
StapelPol q = (StapelPol)quelle;
inhalt = new Object[q.inhalt.length]; // neue Reihung erzeugen (evtl. alte verlieren)
spitze = q.spitze;
for (int index = 0; index < spitze; index++)
inhalt[index] = q.inhalt[index];
} catch (OutOfMemoryError ausnahme) {
throw new VollAusnahme();
}
}
/** Vergleicht den Inhalt zweier Stapel.
const
@param stapel const der zu vergleichende Stapel
@return true wenn die beiden Stapel dieselben Elemente enthalten
*/
public boolean istGleich(final Stapel stapel) {
StapelPol s = (StapelPol)stapel;
if (spitze != s.spitze)
return false;
for (int index = 0; index < spitze; index++)
if (inhalt[index] != s.inhalt[index])
return false;
return true;
}
// private Komponenten: private Object[] inhalt; private int spitze;
/** Testtreiber */
public static void main(String[] args) {
try {
StapelPol s = new StapelPol(5);
StapelPol t = new StapelPol(5);
System.out.println("7Pol Test");
System.out.println("leer? " + s.istLeer());
s.eintragen(new Integer(1));
System.out.println("Nicht leer? " + s.istLeer());
System.out.println("lesen = 1?" + s.lesen());
s.eintragen(new Integer(2));
System.out.println("lesen = 2?" + s.lesen());
s.entfernen(); // 2
System.out.println("lesen = 1?" + s.lesen());
s.eintragen(new Integer(2));
s.eintragen(new Integer(3));
s.eintragen(new Integer(4));
System.out.println("Nicht voll? " + s.istVoll());
System.out.println("Nicht leer? " + s.istLeer());
s.eintragen(new Integer(5));
System.out.println("Voll? " + s.istVoll());
System.out.println("lesen = 5?" + s.lesen());
System.out.print("Ausnahme voll? ");
try {
s.eintragen(new Integer(6));
} catch (VollAusnahme voll) {
System.out.println("Ausnahme voll");
}
t.kopieren(s);
System.out.println("Gleich? " + t.istGleich(s));
System.out.println("Gleich? " + s.istGleich(t));
System.out.println("lesen = 5?" + t.lesen());
s.entfernen(); // 5
System.out.println("lesen = 4?" + s.lesen());
System.out.println("Nicht gleich? " + t.istGleich(s));
System.out.println("Nicht gleich? " + s.istGleich(t));
System.out.println("lesen = 4?" + s.lesen());
s.entfernen(); // 4
s.entfernen(); // 3
s.entfernen(); // 2
System.out.println("lesen = 1?" + s.lesen());
s.entfernen(); // 1
System.out.println("Nicht voll? " + s.istVoll());
System.out.println("leer? " + s.istLeer());
System.out.print("Ausnahme leer? ");
try {
System.out.println("lesen falsch: " + s.lesen());
} catch (LeerAusnahme voll) {
System.out.println("Ausnahme leer");
}
System.out.print("Ausnahme leer? ");
try {
s.entfernen();
} catch (LeerAusnahme voll) {
System.out.println("Ausnahme leer");
}
System.out.println("Test abgeschlossen");
} catch (Exception ausnahme) {
System.out.println("Ausnahme: " + ausnahme);
}
}
}
© APSIS GmbH
, Polling,
2000