Algorithmen und Datenstrukturen Fachhochschule Wiesbaden
Sommersemester 2008 Prof. Dr. Steffen Reith
8. ¨ Ubungsblatt
Aufgabe 1 (Stacks)
In dieser Aufgabe soll ein Stack implementiert werden. Als Hilfestellung finden Sie unten eine grobe Skizze der ben¨otigten Klassenstruktur, Sie k¨onnen aber auch eine davon abweichende Implementierung vornehmen.
• Implementieren Sie den abstrakten Datentyp Stack in JAVA als Generic. Auf jeden Fall sind die Methoden push, popund isEmpty zu implementieren.
Ein (evtl. nicht vollst¨andiges) Beispiel f¨ur die Schnittstelle der Datentyps Stack:
public interface Stack<E>
{
// Ein Element auf den Stack legen public void push(E obj);
// Oberstes Element vom Stack entfernen und Wert zurueckgeben public E pop();
// Oberstes Element vom Stack zurueckliefern public E top();
// Ausgabe, ob der Stack leer ist public boolean isEmpty();
}
public class NodeStack<E> implements Stack<E> { // Ein Element im Stack wird durch eine
// Instanz von Node<N> repraesentiert private class Node<N> {
// Nutzdaten private N data;
// Naechstes Element private Node<N> next;
//Konstruktor
public Node (N o, Node<N> n) {...}
// Nutzdaten setzen
public void setData(N o) {...}
// Nutzdaten auslesen public N getData() {...}
// Nachfolger setzen
public void setNext(Node<N> n) {...}
// Naechsten Knoten zurueckgeben public Node<N> getNext() {...}
}
// Rest der Implementierung }
• Schreiben Sie ein Testprogramm (oder Methode), dass auf einem Stack vom Typ Stack<Integer> die Zahlen 1. . .128 nacheinander ablegt. Danach ent- fernen Sie die Elemente des Stacks mit pop und geben sie aus bis der Stack leer ist. Welche Reihenfolge der Zahlen ergibt sich?
Aufgabe 2 (Stacks)
• Die Umgekehrte Polnische Notation (kurz UPN), auch Postfixnotation ge- nannt, wird von einigen bekannten Taschenrechnern verwendet. Bei der UPN werden zuerst die Operanden eingegeben und danach der darauf anzuwenden- de Operator.
Bsp.: Der Ausdruck (3 + 4) lautet in UPN 3 4 + und aus (4∗7) + 3 wird dann 4 7 * 3 +.
Schreiben Sie ein JAVA-Programm, das UPN-Ausdr¨ucke einliest und auswertet in denen Zahlen und die Operatoren + und ∗vorkommen k¨onnen. Verwenden Sie dazu Ihren Stack. Beispiel:
restliche Eingabe Stack (top rechts) Operationen
2 7 * 3 + 2 mal push
* 3 + 2 7 2 mal pop, multiplizieren und push
14 3 + 2 mal push
+ 14 3 2 mal pop, addieren und push
17 Ergebnis: 17
Enth¨alt der Stack nur noch ein Element und ist die Eingabe vollst¨andig gele- sen, so ist das Ergebnis der Berechnung gefunden. Vereinfachend k¨onnen Sie davon ausgehen, dass Ihr Programm nur mit korrekten UPN-Ausdr¨ucken um- gehen k¨onnen muss.
Hinweis: Implementieren Sie die Eingabe so einfach wie m¨oglich (z.B. jede Zahl und jeder Operator wird einzeln eingelesen. Das Ende der Eingabe wird mit einem besonderen Zeichen angezeigt.).
Optional: Mit wenig Aufwand kann man Ihre Implementierung um die Ope- randen − und /erweitern. Implementieren Sie diese Erweiterung.
2
Aufgabe 3 (Listen) Zur L¨osung dieser Aufgabe m¨ussen Sie folgende Punkte ber¨ucksichtigen:
• Implementieren Sie eine doppelt-verketteten Liste von ganzen Zahlen inC. Zu implementieren sind die Methodeninsertund isEmpty. Die Methodeinsert f¨ugt einen neuen Wert so in die Liste ein, dass sie sortiert ist. D.h. enth¨alt die Liste schon die Zahlen 4,7,11, so ergibt ein insert(9)die Liste 4,7,9,11.
• Implementieren Sie ein Testprogramm f¨ur Ihre Liste, das 16 zuf¨allige Werte in die Liste einf¨ugt und sie dann ausgibt.
Die Abnahme erfolgt erst in der KW 24 vom 9.6.2008 - 13.6.2008
3
Einige optionale ¨ Ubungsaufgaben (aus ¨ alteren Klausuren)
• 1. i = 1;
2. while (i < n) { 3. i++;
4. j = 1;
5. do {
6. j = j + 2;
7. while (j <= n) }
Geben Sie den Zeitbedarf der Zeilen 4 bis 7 und f¨ur das gesammte Programm in Abh¨angigkeit von n an. Benutzen Sie die O-Notation.
• Beschreiben Sie Insertion Sort in Pseudocode und sortieren Sie die Zahlen 9 3 2 7 damit. Notieren Sie die sich ergebende Zahlenfolge nach jedem inneren Schleifen- durchlauf.
• Die Zahlen 2, 5, 9, 11 sind in einer (zeigerverketteten) linearen Liste gespeichert.
Erl¨autern Sie mit
”Zeigerbildchen“ und kurzen Kommentaren, wie die Zahl 7 in diese Liste eingef¨ugt wird.
• Was versteht man unter
”terminieren“ und wann ist ein Algorithmus
”korrekt“?
• Welche Laufzeit hat HeapSort im worst case?
• Beschreiben Sie Selection Sort umgangssprachlich.
• Richtig oder falsch?
”Deterministische Algorithmen sind immer korrekt“ Begr¨unden Sie Ihre Antwort!
4