Schnittstellen, Stack und Queue

Ähnliche Dokumente
Stapel (Stack, Keller)

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Übung: Algorithmen und Datenstrukturen SS 2007

public interface Stack<E> { public void push(e e); public E pop();

ihrer Klasse benötigt die Funktion einfuegenan:

II.3.1 Rekursive Algorithmen - 1 -

Programmieren 2 Übung Semesterwoche 2

Binärbäume. Prof. Dr. E. Ehses,

6 Speicherorganisation

Datenstrukturen und Abstrakte Datentypen

Algorithmen und Datenstrukturen

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Einführung in die Programmierung

Große Übung Praktische Informatik 1

Einstieg in die Informatik mit Java

Grundzüge der Wirtschaftsinformatik WS 2002/03. Wiederholung Java. Programmierzyklus. Heiko Rossnagel Problem

Java-Implementierung der Priority-Queue und des Huffman-Algorithmus Effiziente Algorithmen SS12 Übung 4 Aufgabe 5 Johannes Hein

11. Elementare Datenstrukturen

Objektorientierte Programmierung

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

ALP II Dynamische Datenmengen

Vorkurs Informatik WiSe 16/17

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Klausur zur Informatik A WS 2001/2002 Name: Korrektor: Punkte: a) Zeichnen Sie zu der nachstehenden Syntax in EBNF die passenden Syntaxdiagramme.

Speicher und Adressraum

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1

public class SternchenRechteckGefuellt {

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

System.out.println("TEXT");

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

1 Polymorphie (Vielgestaltigkeit)

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

Klausur zur Veranstaltung Programmierung (fortgeschrittene Konzepte)

Algorithmen und Datenstrukturen Kapitel 4 Neue Datenstrukturen, besseres (?) Sortieren

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einstieg in die Informatik mit Java

U08 Entwurfsmuster (II)

Rekursive Funktionen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Java-Schulung Grundlagen

Objektorientierte Programmierung

Einführung in die Informatik 2

Verkettete Listen. Implementierung von einfach verketteten Listen. Implementierung von doppelt verketteten Listen

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Advanced Programming in C

Abstrakte Datentypen.

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Struktur am Beispiel einer Liste

Studentische Lösung zum Übungsblatt Nr. 7

Vorlesung Datenstrukturen

Programmieren 2 Java Überblick

Institut für Informatik

Programmiertechnik Methoden, Teil 2

Programmierkurs Java

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Programmieren 2 Java Überblick

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

Programmieren in C. Rekursive Strukturen. Prof. Dr. Nikolaus Wulff

To know recursion, you must first know recursion. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel 17 1

Nachklausur Bitte in Druckschrift leserlich ausfüllen!

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

II.1.1. Erste Schritte - 1 -

Algorithmen und Datenstrukturen (für ET/IT)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems

11. Rekursion, Komplexität von Algorithmen

12. Rekursion Grundlagen der Programmierung 1 (Java)

Kapitel 3: Datentyp Liste

4. Algorithmen und Datenstrukturen I Grundlagen der Programmierung 1 (Java)

JAVA für Nichtinformatiker - Probeklausur -

Type Erasure in Java 5. Helmi Jouini Institut für Theoretische Informatik Universität Karlsruhe

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Rekursion. Sie wissen wie man Programme rekursiv entwickelt. Sie kennen typische Beispiele von rekursiven Algorithmen

JAVA - Methoden - Rekursion

JAVA KURS COLLECTION

Ich liebe Java && Ich liebe C# Rolf Borst

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Algorithmen und Datenstrukturen

7. Übung zu Algorithmen und Datenstrukturen

Programmieren I. Methoden-Special Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Programmieren in Java

Java Einführung ABLAUFSTEUERUNG Kapitel 3 und 4

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Allgemeine Hinweise:

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Java Einführung Collections

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

(06 - Anwendungen von Stapeln und Schlangen)

Informatik B von Adrian Neumann

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Programmieren in Java

Grundlagen der Programmierung Prof. H. Mössenböck. 11. Objektorientierung

Nachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.

Probeklausur: Programmierung WS04/05

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Transkript:

Schnittstellen, Stack und Queue Schnittstelle Stack Realisierungen des Stacks Anwendungen von Stacks Schnittstelle Queue Realisierungen der Queue Anwendungen von Queues Hinweise zum Üben Anmerkung: In den Beispielen werden keine Generics verwendet 1

Stack: Last In First Out = LIFO 2

public interface Stack { /** Speichert obj oben auf dem Stapel. * Vorbed.: Stapel nicht voll! Frage: was ist besser? * @param obj zu speicherndes Objekt */ public void push(object obj); /** Entfernt das oberste Stapelelement und gibt es zurück. * Vorbed.: Stapel nicht leer! * @return oberstes Stapelobjekt * @throws NoSuchElementException, wenn Stack leer */ public Object pop(); /** Gibt das oberste Element zurück ohne es zu entfernen. * Vorbed.: Stapel ist nicht leer! * @return oberstes Stapelobjekt * @throws NoSuchElementException, wenn Stack leer */ public Object peek(); /** Ist der Stack voll? * @return true, wenn Speicher erschöpft */ public boolean isfull(); /** Ist der Stack leer? * @return true, wenn Stack leer */ public boolean isempty(); 3

public interface GenericStack<T> { // ALTERNATIVE public void push(t obj); public T pop(); public T peek(); public boolean isfull(); public boolean isempty(); 4

public class LinkedListStack implements Stack { private final SinglyLinkedList data; public LinkedListStack() { data = new SinglyLinkedList(); public void push(object obj) { data.addfirst(obj); public Object pop() { return data.removefirst(); Die Klasse LinkedListStack löst ihre Aufgaben mithilfe der Klasse SinglyLinkedList. Man sagt, dass sie ihre Arbeit an die Klasse SinglyLinkedList delegiert. public Object peek() { return data.getfirst(); public boolean isfull() { return false; public boolean isempty() { return data.isempty(); 5

public class ArrayStack implements Stack { private int top; private final Object[] data; public ArrayStack(int n) { top = 0; /* naechster freier Platz */ data = new Object[n]; public void push(object obj) { data[top++] = obj; /* bei Überlauf: Exception! */ public Object pop() { if (isempty()) throw new NoSuchElementException(); return data[--top]; // data[top] = null; public Object peek() { if (isempty()) throw new NoSuchElementException(); return data[top-1]; public boolean isfull() { return top == data.length; public boolean isempty() { return top == 0; 7

Einfache Anwendung der Stackklassen public static void eingabe(stack s) { boolean weiter = true; while (weiter) { System.out.print("Eingabe: "); int zahl = scanner.nextint(); if (zahl!= 0) s.push(integer.valueof(zahl)); else weiter = false; public static void ausgabe(stack s) { while (!s.isempty()) System.out.print(s.pop() + " "); System.out.println(); public static void main (String[] args) { System.out.println("Bitte Werte für ersten Stack eingeben: "); Stack s = new LinkedListStack(); // oder ArrayStack(10); eingabe(s); System.out.print("Das war: "); ausgabe(s); 8

Anwendungen von Stacks Laufzeitstack für Methodenaufrufe rekursive Algorithmen lassen sich mit Hilfe von Stacks immer durch Schleifen beschreiben (allerdings ist dies dann viel schlechter lesbar und langsamer als die rekursive Formulierung) UPN-Taschenrechner Syntaxanalyse (in Compiler oder Dateieingabe vgl.: Kellerautomat ) Java-Laufzeitsystem (temporäre Variable) Praktikumsaufgabe (LIFOQueue) 9

Simulation der Rekursion mittels Stack (1) static long fib(int n) { if (n <= 1) return 1; else return fib(n-1) + fib(n-2); Die genaue Simulation des rekursiven Ablaufes ist sehr kompliziert und ineffizient! Eine wesentliche Vereinfachung ist möglich: Es wird eine einzige Summe gebildet, bei der es nicht auf die Reihenfolge der Summanden ankommt. Diese Summe wird nur in dem Fall n==0 oder n==1 um 1 erhöht. Ansonsten muss man sich nur vormerken, dass noch zwei Fibonacci-Werte zu berechnen sind. 10

Simulation der Rekursion mittels Stack (2) static long fib_mitstack(int n) { long summe = 0; Stack s = new ArrayStack(); s.push(integer.valueof(n)); while (!s.isempty()) { int i = ((Integer)s.pop()).intValue(); if (i <= 1) // Abbruchbedingung summe++; else { // rekursive Aufrufe s.push(integer.valueof(i-1)); s.push(integer.valueof(i-2)); return summe; Fazit: Auch dieser Algorithmus ist sehr langsam! Es gibt aber einige sinnvolle Anwendungen dieser Idee (z.b. verallgemeinerte Graphsuche). (Anmerkung: Natürlich hätte man einen speziellen Stack<Integer> verwenden können.) 11

Queue: First In First Out = FIFO 12

public interface Queue { /** Hängt obj an die Queue an. * Vorbed.: Die Queue ist nicht voll! * @param obj zu speicherndes Objekt */ public void put(object obj); /** Entnimmt das erste Element aus der Queue. * Vorbed.: Die Queue nicht leer! * @return erstes Element * @throws NoSuchElementException, wenn Queue leer */ public Object get(); /** Ist die Queue voll? * @return true, wenn Speicher erschöpft */ public boolean isfull(); /** Ist die Queue leer? * @return true, wenn Queue leer */ public boolean isempty(); 13

public class LinkedListQueue implements Queue { private final SinglyLinkedList data; public LinkedListQueue() { data = new SinglyLinkedList(); public void put(object obj) { data.addlast(obj); public Object get() { return data.removefirst(); Die Klasse ListQueue ist fast identisch zu ListStack. Problem: Komplexität von put() = O(n) Lösung? public boolean isfull() { return false; public boolean isempty() { return data.isempty(); 14

public class ArrayQueue implements Queue { private final Object[] data; // Array um die Daten zu speichern private int size; // Anzahl der Daten... public boolean isfull() { return size == data.length; public boolean isempty() { return size == 0;... Wie sollen wir die Queue realisieren? Queue v = new ArrayQueue(20); for (int i=0; i<20; i++) q.put(integer.valueof(i)); for (int i=0; i<19; i++) System.out.putln(q.get()); ist Verschieben der Daten eine Lösung? 15

Realisierung eines zirkulären Puffers 16

private final Object[] data; private int size, in, out; public ArrayQueue(int n) { size = 0; // Anzahl der Inhalte in = 0; // nächster freier Platz out =0; // nächster Inhalt data = new Object[n]; public void put(object obj) { if(isfull()) throw new IndexOutOfBoundsException( queue full ); size++; data[in] = obj; in = (in+1) % data.length; public Object get() { if(!isempty()) { size--; Object result = data[out]; data[out] = null; out = (out+1) % data.length; return result; else throw new NoSuchElementException(); 17

Anwendungen von Queues Datenpuffer Nachrichtenaustausch (mailbox) Ablaufsteuerung (z.b. Printer-Queue, ready queue) Algorithmen (s. ebenenweise Baumtraversierung, Breitensuche) Abwandlung durch priority queue. 18

Hinweise zur direkten Realisierung von Stack / Queue durch verkettete Listen Stack und Queue: Operationen nur an den Enden der Datenstruktur Stack: Hinzufügen und Entfernen am gleichen Ende der Datenstruktur Queue: Hinzufügen und Entfernen an entgegengesetzten Enden der Datenstruktur Einfügen am Anfang der verketteten Liste: einfach Entfernen am Anfang der verketteten Liste: einfach Einfügen am Ende der verketten Liste: einfach, wenn letztes Element bekannt Entfernen am Ende der verketteten Liste: aufwändig (man muss das vorletzte Element kennen) 19