© APSIS GmbH extern.gif (1249 Byte), Polling, 2000


StapelPol

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 extern.gif (1249 Byte), Polling, 2000