Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke –...

12
Schmiedecke Programmieren 1 Programmieren 2 15 Abstrakte Datentypen Bachelor Medieninformatik Sommersemester 2015 Dipl.-Inform. Ilse Schmiedecke [email protected]

Transcript of Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke –...

Page 1: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

1 Schmiedecke – Programmieren 1

Programmieren 2 15 – Abstrakte Datentypen

Bachelor Medieninformatik Sommersemester 2015

Dipl.-Inform. Ilse Schmiedecke

[email protected]

Page 2: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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

Page 3: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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 {}

Page 4: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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

Page 5: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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.

Page 6: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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

Page 7: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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

Page 8: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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

Page 9: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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

Page 10: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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

Page 11: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

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

Page 12: Programmieren 2 15 Abstrakte Datentypen - schmiedecke · 2015-11-29 · Schmiedecke – Programmieren 1 1 Programmieren 2 15 – Abstrakte Datentypen Bachelor Medieninformatik Sommersemester

12 Schmiedecke – Programmieren 1

Nächstes Mal verwenden wir Fertigprodukte

12