© APSIS GmbH , Polling, 2000
Polymorphe Implementierung der Schnittstelle Stapel als verkettete Liste aus der Bibliothek für das Lehrbuch Programmieren mit Java
Dokumentation Programmtext ohne Dokumentation
/* * @(#)kapitel9/StapelListe.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 verkettete Liste */ public class StapelListe implements Stapel {
/** parameterloser Konstruktor */ public StapelListe() { anker = null; }
/** Kopierkonstruktor. @param quelle const der zu kopierende Stapel @exception VollAusnahme der kopierte Stapel kann wegen Speichermangel nicht erstellt werden */ public StapelListe(final StapelListe quelle) throws VollAusnahme { this(); kopieren(quelle); }
/** entleert den Stapel */ public void entleeren() { anker = null; }
/** Trägt ein Element in den Stapel ein. @param element const das einzutragende Objekt @exception VollAusnahme das Objekt kann nicht mehr eingetragen werden @see StapelListe#istVoll */ public void eintragen (final Object element) throws VollAusnahme { try { anker = new Knoten(element, anker); } catch(OutOfMemoryError ausnahme) { 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 StapelListe#istLeer */ public Object lesen () throws LeerAusnahme { try { return anker.wert; } catch(NullPointerException ausnahme) { throw new LeerAusnahme(); } }
/** Entfernt das jüngste Element aus dem Stapel. @exception LeerAusnahme es gibt kein Objekt im Stapel @see StapelListe#istLeer */ public void entfernen() throws LeerAusnahme { try { anker = anker.verbindung; } catch(NullPointerException ausnahme) { throw new LeerAusnahme(); } }
/** Überprüft ob der Stapel leer ist. Wenn false, LeerAusnahme wird nicht ausgelöst. const @return true wenn der Stapel leer ist @see StapelListe#lesen @see StapelListe#entfernen */ public boolean istLeer(){ return anker == null; }
/** Überprüft ob der Stapel voll ist. const Wenn false, VollAusnahme wird nicht ausgelöst. @return true wenn der Stapel voll ist @see StapelListe#eintragen */ public boolean istVoll() { try { Knoten knoten = new Knoten(); // Versuch return false; // ist gelungen } catch(OutOfMemoryError ausnahme) { return true; // kein Platz mehr } }
// Implementierungen für kopieren und istGleich: mit Wiederholung und rekursiv /** 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 StapelListe quelle) throws VollAusnahme { entleeren(); Knoten knoten = quelle.anker; while (knoten != null) { eintragen(knoten.wert); knoten = knoten.verbindung; } }
/** 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 StapelListe stapel) { Knoten dieses = anker; Knoten jenes = stapel.anker; while (dieses != null && jenes != null) { if (dieses.wert != jenes.wert) return false; dieses = dieses.verbindung; jenes = jenes.verbindung; } return dieses == null && jenes == null; }
/** Kopiert Inhalt des Stapels; rekursive Implementierung. @param quelle const der zu kopierende Stapel @exception VollAusnahme der kopierte Stapel kann wegen Speichermangel nicht erstellt werden */ public void kopierenRek(final StapelListe quelle) throws VollAusnahme { anker = knotenKopie(quelle.anker); } private Knoten knotenKopie(final Knoten quelle) throws VollAusnahme { Knoten ziel = null; try { ziel = new Knoten(quelle.wert); // throws NullPointerException, wenn quelle == null ziel.verbindung = knotenKopie(quelle.verbindung); // rekursiver Aufruf } catch(NullPointerException ausnahme) {} // Liste zu Ende catch(OutOfMemoryError ausnahme) { // kein Speicher mehr frei throw new VollAusnahme(); } return ziel; }
/** Vergleicht den Inhalt zweier Stapel; rekursive Implementierung. const @param stapel const der zu vergleichende Stapel @return true wenn die beiden Stapel dieselben Elemente enthalten */ public boolean istGleichRek(final StapelListe stapel) { return knotenVergleichen(anker, stapel.anker); }
private boolean knotenVergleichen(final Knoten erster, final Knoten zweiter) { try { return erster.wert == zweiter.wert & // throws NullPointerException, wenn eine Referenz == null knotenVergleichen(erster.verbindung, zweiter.verbindung); // rekursiver Aufruf } catch(NullPointerException ausnahme) { // eine der Listen zu Ende return erster == null & zweiter == null; // auch die andere? } }
// private Komponenten: private class Knoten { // lokale Klasse ähnlich wie im Programm (9.9) Object wert; Knoten verbindung; Knoten() {} // parameterloser Konstruktor (Attrappe für den Versuch in voll) Knoten(final Object wert) { // Konstruktor mit einem Parameter this.wert = wert; // verbindung == null } Knoten(final Object wert, final Knoten verbindung) { // Konstruktor mit zwei Parametern this.wert = wert; this.verbindung = verbindung; } }
private Knoten anker = null;
/** Testtreiber */ public static void main(String[] args) { try { StapelListe s = new StapelListe(); StapelListe t = new StapelListe(); System.out.println("StapelPol 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());
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));
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