View
7
Download
0
Category
Preview:
Citation preview
1 Schmiedecke – Programmieren 1
Programmieren 2 15 – Abstrakte Datentypen
Bachelor Medieninformatik Sommersemester 2015
Dipl.-Inform. Ilse Schmiedecke
schmiedecke@beuth-hochschule.de
2 Schmiedecke – Programmieren 1
Typ, der eine variable Anzahl von Objekten eines geeigneten
Elementtyps speichern kann
Standardoperationen: - hinzufügen - suchen /lesen - entnehmen / löschen - aktuelleAnzahl - evtl. maximaleAnzahl
Array ist eine mögliche Implementierungstechnik Vorteil von Arrays: Direktzugriff per Index Nachteil: Feste Länge, mittiges Einfügen/Löschen sehr aufwändig
Verallgemeinerte Datenbehälter
2
3 Schmiedecke – Programmieren 1
3
Stack und Queue
(Stapel und Warteschlange) Zwei sehr wichtige Datenbehälter-Typen
Identische Schnittstelle, unterschiedliches Verhalten
interface Container {
void add(Object o);
Object remove()throws EmptyExcption;
Object peek()throws EmptyExcption;
}
interface LiFo
extends Container {}
interface FiFo
extends Container {}
4 Schmiedecke – Programmieren 1 4
Stack-Implementierung (LIFO) mit einem Array
class StackArray implements LiFo {
private Object[] stack = new Object[size];
private int top = 0;
public void add(Object obj) {
if (top == size) throw new FullException();
stack[top] = obj;
top++;
}
public Object remove() throws EmptyException {
if (top==0) throw new EmptyException();
top --;
return stack[top];
}
public Object peek() throws EmptyException{
if (top==0) throw new EmptyException();
return stack[top-1];
}
}
top
5 Schmiedecke – Programmieren 1 5
Die Exception-Klassen
class EmptyException extends Exception { }
// "normale" Exception – erscheint im Interface.
// Muss behandelt werden
// Entnahme aus leerem Datenbehälter
// ist immer ein Fehler
class FullException extends RuntimeException { }
// Runtime Exception – erscheint nicht im Interface
// Bei einer Array-Implementierung gibt es eine
// feste Obergrenze
// Aber es gibt auch flexible Datenbehälter,
// da tritt diese Exception nicht auf.
6 Schmiedecke – Programmieren 1
Queue-Implementierung (FIFO) - Strategie
2 "Zeiger":
Ältester Eintrag (last) Entnehmen
Nächste freie Stelle (next) Einfügen
Beide wandern aufwärts
Zählvariable count verhindert "Überholen"
6
last
next
count
Zählen "über den Rand" modulo
7 Schmiedecke – Programmieren 1 7
Queue-Implementierung (FIFO) mit einem Array class QueueArray implements FiFo {
private Object[] queue = new Object[size];
private int next=0, last=0, count=0;
void add(Object obj) {
if (count>=size) throw new FullException();
queue[next] = obj;
next = (next+1)%size; // modulo
count ++;
}
Object remove() throws EmptyException {
if (count==0) throw new EmptyException();
Object obj = queue[last];
count --;
last = (last+1)%size;
return obj;
}
// peek analog
}
0 1
2
3
4
5 6 7
8
9
10
11
12 next
last
8 Schmiedecke – Programmieren 1
Ein Abstrakter Datentyp (ADT) ist
Eine Klasse mit einer privaten Datenstuktur
und öffentlichen Zugriffsmethoden.
Sie implementiert i.d.R. ein Interface.
Die Zugriffsmethoden folgen einer bestimmten Strategie, die für den abstrakten Datentyp charateristisch ist (z.B. Queue)
Ein Abstrakter Datentyp ist typischerweise durch Exceptions "gesichert", d.h. robust gemacht.
Zusammenfassung Abstrakte Datentypen
8
9 Schmiedecke – Programmieren 1
In der Informatik kommen beide oft vor!
Queue:
Nachrichtensysteme ("Mail" von Prozess zu Prozess)
Warteschlangen bei der Ereigisbehandlung
Scheduling
Stack:
Aufrufstack der Methoden
Evaluation von Ausdrücken etc.
Umwandlung von Rekursion in Iteration
Was kann man mit Stack und Queue anfangen?
9
10 Schmiedecke – Programmieren 1
Die prioritätentreue Auswertung von Ausdrücken mit und ohne Klammern ist kompliziert!
Zur Erleichterung der Abarbeitung gibt es die "Umgekehrte Polnische Notation" oder Postfix-Notation
Umformung Infix Postfix mit dem "Rangierbahnhof"-Algorithmus ("Shunting Yard") unter Verwendung eines Stacks für die Operatoren und einer Queue für das Ergebnis.
Postfix-Formel kann auf einem Stack direkt ausgewertet werden!
"Polnisch Rückwärts"
10
11 Schmiedecke – Programmieren 1
Programm-Strategie: Formel als String lesen [ Eingabe bereinigen (unerlaubte Zeichen entfernen) ] Durch split an Leerzeichen auftrennen und in ein String-Array speichern Mithilfe des Shunting Yard-Algorithmus Array in eine UPN-Formel umwandeln,
als Queue zurückgeben intern wird zusätzlich ein Stack für die Operatore verwendet
Die UPN-Formel von vorn nach hinten auswerten und das Ergebnis zurückgeben intern wird ein Stack für die Operanden verwendet
Die Main-Methode
12 Schmiedecke – Programmieren 1
Nächstes Mal verwenden wir Fertigprodukte
12
Recommended