Algorithmik I, WS 2005/06 Carsten Dachsbacher, [email protected] Aufgabenblatt 9 Abgabe: 23. Dezember 2005, 20:00 Aufgabe 9.1: ADT Keller [20 Praxis-Punkte] Implementieren Sie, ohne auf in Java standardmässig vorhandene Klassen zurückzugreifen, den abstrakten Datentyp Keller wie Sie ihn in der Vorlesung kennengelernt haben. Gegeben ist dazu die folgende Signatur eines Kellers aus Java Objekten (Object): create: add: pop: top: empty: Object x Keller Keller Keller Keller → → → → → Keller Keller Keller Object boolean Formulieren Sie ein entsprechendes objekt-orientiertes Java Interface Keller, wobei ’create’ durch den Konstruktor der Klasse ersetzt wird, die das Interface implementiert. Implementieren Sie dann Ihr Keller Interface mit einer public Klasse KellerImplementierung und testen Sie Ihre Implementierung mit einer public Klasse KellerTest. Verwenden Sie dazu eine Instanz der Klasse KellerImplementierung auf die Sie mittels einer Referenzvariable des Typs Klasse zugreifen. Die Größe des Kellers beschränken Sie in Ihrer Implementation auf 256 Elemente. Geben Sie folgende Dateien ab: • Keller.java • KellerImplementierung.java • KellerTest.java Aufgabe 9.2: Fingerübung: Verkettete Listen [40 Praxis-Punkte] Ziel dieser Aufgabe ist es, den Umgang mit verketteten Listen zu üben. Implementieren Sie das folgende Interface einer einfach verketteten, sortierten Liste (public class SortedListImplementierung): 1 2 3 4 5 6 7 8 9 10 public interface SortedList { public void add( Comparable o ); public void add( SortedList l ); public void remove( Comparable o ); public Comparable getFirst(); public Comparable getNext( Comparable o ); public Comparable getPrevious( Comparable o ); public void shuffle(); public boolean empty(); }//interface SortedList Um die Elemente der verketteten Liste zu repräsentieren, verwenden Sie folgende Klasse: 1 2 3 4 class ListNode { public Comparable public ListNode } c; next; // Referenz auf ein Listenelement // Nächster Knoten der verketteten Liste Seite 1 von 2 Algorithmik I, WS 2005/06 Carsten Dachsbacher, [email protected] • Die Elemente der Liste implementieren das Comparable Interface, d.h. sie besitzen eine compareTo Methode, die eine Ordnung der Listen-Elemente erlaubt. Implementieren Sie die verkettete Liste so, dass die Elemente, die mit der add Methode eingefügt werden, aufsteigend sortiert sind. Alle Operationen der Liste arbeiten mit den Referenzen auf die übergebenen Comparable. • Die remove Methode entfernt ein Element der Liste - implementieren Sie so, dass nur eine Membervariable next geändert werden muss, um ein Element zu entfernen. • Die Methode getFirst liefert den Kopf der verketteten Liste, getNext bzw. getPrevious jeweils das nächste bzw. vorherige Element. Existitert das entsprechende Element nicht, ist der Rückgabewert null. • Überlegen Sie sich eine Möglichkeit, die verhindert, dass bei getNext die Liste vom Listenkopf an durchsucht wird, bis das gesuchte Element gefunden wird und der Nachfolger zurückgegeben werden kann. Implementieren Sie die Klasse entsprechend! • Implementieren Sie eine Methode shuffle, die eine Liste analog zu den folgenden Beispielen umordnet und implementieren Sie die Methode so, dass Sie nur die Referenzen auf den jeweils nächsten Listenknoten (next) modifizieren: (1, 2, 3, 4) −→ shu f f le −→ (1, 4, 2, 3) (1, 2, 3, 4, 5) −→ shu f f le −→ (1, 5, 2, 4, 3) (1, 2, 7, 14, 15, 18) −→ shu f f le −→ (1, 18, 2, 15, 7, 14) (3, 5, 7, 8, 9, 12, 17) −→ shu f f le −→ (3, 17, 5, 12, 7, 9, 8) Wenn Sie Java 1.5 verwenden können Warnmeldungen beim Übersetzen auftreten, die Sie aber ignorieren können! Geben Sie folgende Datei ab: • SortedListImplementierung.java Aufgabe 9.3: ADT Mengen [30 Theorie-Punkte] Geben Sie die Signatur und die Axiome einer Menge an. Eine Menge kann leer sein oder ein oder mehrere Elemente T enthalten, wobei jedes Element nur einmal in der Menge vorkommen kann. Für die Elemente T existiert ein Gleichheitsoperator. Folgende Operationen sollen auf einer Menge möglich sein: • Leere Menge erzeugen: create • Element hinzufügen: add • Überprüfen ob ein Element in der Menge vorhanden ist: isIn • Element aus der Menge entfernen: del • Überprüfen ob die Menge leer ist: empty • Erzeugen einer ein-elementigen Menge: single • Die Schnittmenge zweier Mengen bilden: intersect • Die Vereinigung zweier Mengen: union Seite 2 von 2