© 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