Algorithmen und Datenstrukturen Hochschule RheinMain
Sommersemester 2014 Prof. Dr. Steffen Reith
8. Übungsblatt
Aufgabe 1 (Stacks)
In dieser Aufgabe soll der abstrakte Datentyp Stack implementiert werden. Dabei soll ihre Implementierung so flexibel sein, dass sie (z.B. durch neues Übersetzen leicht) auf einen anderen Basisdatentyp angepasst werden kann. Verwenden Sie dazu ein geeignetes #define. Auf jeden Fall sind die Methoden push, pop und isEmpty zu implementieren.
Schreiben Sie ein Testprogramm, dass auf einem Stack von Typ int die Zahlen 1. . .128 nacheinander ablegt. Danach entfernen Sie die Elemente des Stacks mit popund 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 genannt, wird von einigen bekannten Taschenrechnern verwendet. Bei der UPN werden zuerst die Operanden eingegeben und danach der darauf anzuwendende Operator.
Bsp.: Der Ausdruck (3 + 4)lautet in UPN 3 4 + und aus(4∗7) + 3wird dann 4 7 * 3 +.
Schreiben Sie ein Programm, das UPN-Ausdrücke einliest und auswertet in denen Zahlen und die Operatoren + und ∗ vorkommen können. 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
3 + 14 1 mal push
+ 14 3 2 mal pop, addieren und push
17 Ergebnis: 17
Enthält der Stack nur noch ein Element und ist die Eingabe vollständig gelesen, so ist das Ergebnis der Berechnung gefunden. Vereinfachend können Sie davon ausgehen, dass Ihr Programm nur mit korrekten UPN-Ausdrücken umgehen kön- nen muss.
• Wieviele Elemente können während einer Berechnung maximal auf dem Stack liegen? Berücksichtigen Sie diese Überlegung für die (evtl.) Verein- fachung Ihrer Implementation.
• Implementieren Sie die Eingabe so einfach wie möglich (z.B. jede Zahl und jeder Operator wird einzeln (neue Zeile) 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.
Aufgabe 3 (Bäume)
Die Höhe eines Baums ist definiert als die Anzahl der Knoten in einem längsten Pfad von Knoten zu einem Blatt. Damit hat ein Baum der nur aus der Wurzel besteht schon die Höhe 1. Beweisen Sie, dass ein vollständiger trinärer Baum (jeder Knoten der kein Blatt ist hat genau3Kinder) der Höhehgenau(3h−1)/2 Knoten enthält.
Hinweis: Wissen über die Geometrische Reihe ist immer nützlich.
Die Abnahme der Lösungen zu diesen Aufgaben findet erst in der KW 24 ab dem 12. Juni 2014 nach der Vorlesung statt. Die Termine für die WI- Gruppen gibt Herr Werntges bekannt!
2
Einige optionale Übungsaufgaben (aus älteren Klausuren)
• 1. i = 1;
2. while (i < n) { 3. i++;
4. j = 1;
5. do {
6. j = j + 2;
7. } while (j <= n) 8. }
Geben Sie den Zeitbedarf der Zeilen 4 bis 7 und für das gesammte Programm in Abhängigkeit 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 Schleifendurchlauf.
• Die Zahlen 2, 5, 9, 11 sind in einer (zeigerverketteten) linearen Liste gespeichert.
Erläutern Sie mit
”Zeigerbildchen“ und kurzen Kommentaren, wie die Zahl 7 in diese Liste eingefügt wird.
• Was versteht man unter
”terminieren“ und wann ist ein Algorithmus
”korrekt“?
• Welche Laufzeit hat MergeSort im worst case?
• Beschreiben Sie Selection Sort umgangssprachlich.
• Richtig oder falsch?
”Deterministische Algorithmen sind immer korrekt“ Begrün- den Sie Ihre Antwort!
3