Einführung in die Informatik – Algorithmen und Datenstrukturen Thema 14 – Stapel und Warteschlangen Warteschlangen - Queues Warteschlange Eine Warteschlange ist eine eingeschränkte Form des abstrakten Datentyps Liste. Elemente dürfen nur hinten, am Ende, eingefügt und am anderen Ende, am Anfang, entfernt werden (Umkehrung auch zulässig). Warteschlangen werden auch als fifo (first in - first out)Speicher bezeichnet. 2 Spezifikation des ADT - Queue Die Beschreibung des ADT Queue erfolgt exakt über Import, Export, Wertebereich und Operationen. Import: Typen: TInhalt Export: Typen: TQueue Wertebereich: Die Elemente der Datenstruktur sind linear angeordnet. Ein neues Element kann nur am Ende eingefügt werden, entfernt werden kann ein Element nur am Anfang. (FiFo-Struktur) Die Anzahl der Elemente ist durch den zur Laufzeit verfügbaren Speicherplatz begrenzt. Die Elemente enthalten den importierten Inhaltstyp. 3 Operationen auf den ADT - Queue Initialisieren: Methode init (TQueue [aus]) vor nach Es existiert eine leere Schlange (als Ausgangsparameter). /** * Methode init * Initialisierung der Warteschlange */ public void init() { kopf = null; ende = null; } 4 Operationen auf den ADT - Queue Einfügen: Methode put (TQueue [ein/aus]; TInhalt[ein]) vor Die Schlange existiert und nicht voll. nach Der Inhalt ist als letzte Element der Schlange angefügt. /** * Methode put, fuegt ein neue Objekt an die Schlange an */ public void put() { Element akt; akt = new Element(); // Element erzeugen if (kopf == null){ kopf = akt; akt.next = null; ende = akt; } else { ende.next = akt; ende = akt; } } 5 Operationen auf den ADT - Queue Entnehmen: Methode Get (TQueue [ein/aus]; TInhalt[aus]) vor Die Warteschlange existiert und nicht leer. nach Das erste Element der Schlange ist entfernt, eine Kopie seines Inhaltes steht im zweiten Parameter. /** * Methode get, Entnehmen des 1. Objektes der Warteschlange */ public Element get() { Element akt = kopf; if (kopf != null) { kopf = kopf.next; } return akt; } 6 Operationen auf den ADT - Queue Anzahl?: Methode vor nach Count (TQueue [ein]): Integer Die Schlange existiert. Die Anzahl der Elemente der Schlange wird als Funktionsergebnis zurückgegeben. /** * Methode count * @return gibt die Anzahl der WS-objekte zurueck */ public int count() { int anz = 0; Element akt = kopf; while (akt != null) { anz++; akt = akt.next; } return anz; } 7 Operationen auf den ADT - Queue Ist die Schlange leer?: Methode Empty (TQueue [ein]): Boolean vor Die Schlange existiert. nach Falls die Schlange kein Element enthält, ist das Funktionsergebnis True, ansonsten False. /** * Methode empty * * @return true, wenn Warteschlange leer */ public boolean empty() { boolean em = false; if (kopf == null) em = true; return em; } 8 Operationen auf den ADT - Queue Ist die Schlange voll?: Methode vor nach 9 Full : Boolean Falls im Speicher kein Platz mehr für ein neues Element ist, ist das Funktionsergebnis True, ansonsten False. Operationen auf den ADT-Queue (alternative Notation) Q sei eine Warteschlange deren Elemente vom Typ ETYPE sind und x ist sei Element vom Typ ETYPE. Operation Wirkung clear(Q) Initialisierung, löscht den Inhalt der Warteschlange get(Q,x) gibt FALSE zurück, wenn Q leer ist, sonst wird x auf den Wert des Elementes am Anfang von Q gesetzt, das Element wird aus Q entfernt und TRUE zurückgegeben (dequeue) put (x,Q) (enqueue) gibt FALSE zurück, wenn Q voll ist, sonst wird x am Ende von Q eingefügt und TRUE zurückgegeben isEmpty(Q) gibt TRUE zurück, wenn Q leer ist, sonst FALSE isFull(Q) gibt TRUE zurück, wenn Q voll ist, sonst FALSE 10 Stapel - Stack Stack Ein Stack ist ein abstrakter, auf einem Listenmodell basierender Datentyp. Alle Operationen werden an einem Ende der Liste durchgeführt. Das Element wird als oberstes Element (top) der Liste bezeichnet. Für den Stack ist auch die Bezeichnung lifo (last in - first out) - Speicher gebräuchlich. 11 Spezifikation des ADT - Stack Die Beschreibung des ADT Stack erfolgt exakt über Import, Export, Wertebereich und Operationen. Import: Typen: TInhalt Export: Typen: TStack Wertebereich: Die Elemente der Datenstruktur sind linear angeordnet, nur das jeweils zuletzt hinzugefügte Element (Top-of-Stack) ist erreichbar. Die Anzahl der Elemente ist durch den zur Laufzeit verfügbaren Speicherplatz begrenzt. Die Elemente enthalten den importierten Inhaltstyp. 12 Operationen auf den ADT - Stack Initialisieren: Methode vor nach Init (TStack [aus]) Es existiert ein leerer Stack (als Ausgangsparameter). /** * Methode init * Initialisierung des Stacks */ public void init() { kopf = null; } 13 Operationen auf den ADT - Stack Einfügen: Methode Push (TStack [ein/aus]; TInhalt[ein]) vor Der Stack existiert und nicht voll. nach Das neue Inhaltsobjekt ist der Top-of-Stack. /** * Methode push, legt ein neues Element auf dem Stack ab */ public void push() { Element akt; akt = new Element(); // Element erzeugen akt.next = kopf; kopf = akt; } 14 Operationen auf den ADT - Stack Entnehmen: Methode Pop (TStack [ein/aus]; TInhalt[aus]) vor Der Stack existiert und nicht leer. nach Der Top-of-Stack ist entfernt, das entfernte Objekt wird zurückgegeben. /** * Methode pop , Entnehmen des ersten Objektes */ public Element pop() { Element akt = kopf; if (kopf != null) { kopf = kopf.next; } return akt; } 15 Operationen auf den ADT - Stack Anzeigen: Methode vor nach Top (TStack [ein/aus]; TInhalt[aus]) Der Stack existiert und nicht leer. Eine Kopie des Inhaltes des Top-of-Stack steht im zweiten Parameter zur Verfügung. /** * Methode top * Ausgeben des Inhaltes des obersten Stack-Objektes */ public void top() { if (kopf != null) kopf.container.ausgabe(); } 16 Operationen auf den ADT - Stack Ist Stack leer?: Methode Empty (TStack [ein]):Boolean vor Der Stack existiert. nach Falls sich kein Element im Stack befindet, ist das Funktionsergebnis True, ansonsten False. /** * Methode empty * * @return true, wenn Stack leer */ public boolean empty() { boolean em = false; if (kopf == null) em = true; return em; } 17 Operationen auf den ADT - Stack Ist Stack leer?: Methode vor nach Empty (TStack [ein]):Boolean Der Stack existiert. Falls sich kein Element im Stack befindet, ist das Funktionsergebnis True, ansonsten False. Ist Stack voll?: Methode vor nach 18 Full :Boolean Falls im Speicher kein Platz mehr für ein neues Element ist, ist das Funktionsergebnis True, ansonsten False. Operationen auf einen Stack (alternative Notation) S ist ein Stack vom Typ ETYPE und x ist ein Element vom Typ ETYPE. Operation Wirkung clear(S) Initialisierung, löscht den Inhalt des Stacks isEmpty(S) gibt TRUE zurück, wenn S leer ist, sonst FALSE isFull(S) gibt TRUE zurück, wenn S voll ist, sonst FALSE pop(S,x) gibt FALSE zurück, wenn S leer ist, sonst wird x auf den Wert des obersten Elementes des Stacks gesetzt, das Element entfernt und TRUE zurückgegeben push(x,S) gibt FALSE zurück, wenn S voll ist, sonst wird x als oberstes Element des Stacks eingefügt und TRUE zurückgegeben 19 Literatur /BALZERT96/ /BARNES09/ /HEROLD10/ /RATZ10/ 20 Balzert, Helmut; Lehrbuch der Softwaretechnik; Spektrum Verlag, 1996 David J. Barnes, Michael Kölling Java lernen mit BlueJ Pearson Studium, 2009, ISBN-13: 978-3-86894-001-5 Herold, Helmut; Lurz, Bruno; Wohlrab, Jürgen Grundlagen der Informatik, Pearson Studium, 2007 ISBN 987-3-8273-7305-2 Ratz, Dietmar; Scheffler, Jens; Seese, Detlef; Wiesenberger, Jan; Grundkurs Programmieren in JAVA; Carl-Hanser-Verlag, München, Wien; 2010 ISBN 3-935042-00-0