© APSIS GmbH , Polling, 2000
Polymorphe Implementierung der Schnittstelle Stapel als verkettete Liste aus der Bibliothek für das Lehrbuch Programmieren mit Java
Dokumentation Programmtext mit Dokumentation
package lehrbuch.kapitel9; public class StapelListe implements Stapel {
public StapelListe() { anker = null; }
public StapelListe(final StapelListe quelle) throws VollAusnahme { this(); kopieren(quelle); }
public void entleeren() { anker = null; }
public void eintragen (final Object element) throws VollAusnahme { try { anker = new Knoten(element, anker); } catch(OutOfMemoryError ausnahme) { throw new VollAusnahme(); } }
public Object lesen() throws LeerAusnahme { try { return anker.wert; } catch(NullPointerException ausnahme) { throw new LeerAusnahme(); } }
public void entfernen() throws LeerAusnahme { try { anker = anker.verbindung; } catch(NullPointerException ausnahme) { throw new LeerAusnahme(); } }
public boolean istLeer(){ return anker == null; }
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 public void kopieren(final StapelListe quelle) throws VollAusnahme { entleeren(); Knoten knoten = quelle.anker; while (knoten != null) { eintragen(knoten.wert); knoten = knoten.verbindung; } }
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; }
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; }
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 class Knoten { 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; }
© APSIS GmbH , Polling, 2000