www.wikidata.de-de.nina.az
In der Informatik bezeichnet eine Warteschlange englisch queue kju eine haufig eingesetzte Datenstruktur Sie dient als Puffer zur Zwischenspeicherung von Objekten in einer Reihenfolge bevor diese weiterverarbeitet werden Inhaltsverzeichnis 1 Funktionsprinzip 2 Illustration 3 Anwendung 4 Implementierung als Ringpuffer 5 Zusammenhang mit Stapelspeichern Stacks 6 Programmierung 6 1 C 6 2 C 7 Siehe auch 8 Weblinks 9 EinzelnachweiseFunktionsprinzip BearbeitenEine Warteschlange kann im Gegensatz zum spater beschriebenen Ringpuffer eine beliebige Menge von Objekten aufnehmen und gibt diese in der Reihenfolge ihres Einfugens wieder zuruck Dazu stellen Warteschlangen die Operationen enqueue zum Hinzufugen eines Objekts und dequeue zum Zuruckholen und Entfernen eines Objektes bereit Wahrend die Warteschlange theoretisch unendlich viele Objekte aufnehmen kann kann beim Ringpuffer bei Erschopfung ein Uberlauf eintreten fur den eine Bearbeitung vereinbart werden muss siehe Abschnitt Implementierung als Ringpuffer Dabei wird nach dem Prinzip First In First Out kurz FIFO wortlich zuerst hinein zuerst heraus gearbeitet das heisst es wird von dequeue immer das Objekt aus der Warteschlange zuruckgegeben welches von den in der Warteschlange noch vorhandenen Objekten als erstes mit enqueue hineingelegt wurde Illustration BearbeitenMan kann sich eine Warteschlange wie eine Warteschlange von Kunden an einer Kasse vorstellen Der Letzte der sich in die Schlange stellt wird auch als letzter bedient Umgekehrt wird derjenige der sich als erstes angestellt hat als erster bedient nbsp nbsp Mit enter wird ein neuer Wert 3 der Schlange hinzugefugt und mit leave das am langsten gespeicherte Element 37 herausgenommen Der einzige lesende Zugriff erfolgt mit front displaystyle to nbsp und liefert das erste gespeicherte Element der Queue hier im Beispiel 37 naturlich unter der Annahme dass die Operation leave noch nicht ausgefuhrt wurde Anwendung BearbeitenDie zur Interprozesskommunikation verwendete Pipe ist eine der wichtigsten Anwendungen fur Warteschlangen Durch Warteschlangen werden auch langsame externe Gerate z B Drucker von der Programmabarbeitung entkoppelt Nach dem Einstellen eines Druckauftrages in die Warteschlange wird dem Programm der Auftrag als gedruckt signalisiert tatsachlich wird der Auftrag jedoch erst spater bei Verfugbarkeit des Gerates ausgefuhrt Warteschlangen werden ausserdem haufig zur Datenubergabe zwischen asynchronen Prozessen in verteilten Systemen verwendet wenn also Daten vor ihrer Weiterverarbeitung gepuffert werden mussen Der Zugriff erfolgt dabei durch im Betriebssystem verankerte APIs Die Grosse der Warteschlange wird durch das Betriebssystem limitiert Graphische Benutzeroberflachen puffern Ereignisse der Maus und Tastatur in einer sogenannten Message Queue nach dem FIFO Prinzip d h in der Reihenfolge ihres Auftretens Anschliessend leiten sie diese dann abhangig von Position und Eingabefokus an die korrekten Prozesse weiter Eine Warteschlange kann auch fur Parallele Programmierung verwendet werden Dies kann man sich wie in einer Behorde vorstellen bei dem es mehrere Schalter fur eine Warteschlange gibt So konnen Aufgaben eingestellt werden die spater parallel abgearbeitet werden Implementierung als Ringpuffer Bearbeiten nbsp Ringpuffer mit In Pointer und Out Pointer Ungelesene Elemente sind grun gelesene orange und geleerte grau dargestellt Angezeigt ist auch die Richtung in die der Puffer gefullt wird Hauptartikel Ringpuffer Warteschlangen sind haufig als Ringpuffer mit je einem Zeiger auf das Ende In Pointer und den Anfang Out Pointer der Warteschlange implementiert Die Besonderheit des Ringpuffers ist dass er eine feste Grosse besitzt Dabei zeigt der In Pointer auf das erste freie Element im Array das den Ringpuffer reprasentiert und der Out Pointer auf das erste belegte Element in dem Array Im Unterschied zum Array werden die altesten Inhalte uberschrieben wenn der Puffer voll ist um weitere Elemente in den Ringpuffer ablegen zu konnen Eine Implementierung des Ringpuffers sollte fur den Fall dass der Ringpuffer voll ist entweder einen Pufferuberlauf signalisieren oder zusatzlichen Speicherplatz bereitstellen In anderen Fallen kann das Uberschreiben alter Elemente der Warteschlange und damit der Datenverlust gewollt sein Zusammenhang mit Stapelspeichern Stacks BearbeitenWarteschlangen kann man sich als Bucherstapel vorstellen die von unten befullt werden Dementsprechend gibt es Implementierungen die gar keinen prinzipiellen Unterschied zwischen Stacks und Queues machen In REXX steht das Leseende einer Queue fest Mit PUSH abgelegte Eintrage werden nach dem LIFO Prinzip gelesen Last In First Out mit QUEUE abgelegte nach dem FIFO Prinzip Zur Interprozesskommunikation sind insbesondere Queues interessant Programmierung BearbeitenC BearbeitenDas folgende Beispiel in der Programmiersprache C mit Spielkarten zeigt die Verwendung einer Warteschlange der Klasse queue der C Standardbibliothek siehe auch Template C Klassen Templates Bei der Ausfuhrung des Programms wird die Methode main verwendet 1 include lt queue gt Bindet den Datentyp queue in das Programm ein include lt iostream gt int main using namespace std queue lt string gt myQueue Deklariert eine Queue mit dem Elementtyp string Fugt der Queue 3 Elemente vom Typ string hinzu myQueue push Herz Dame myQueue push Karo Konig myQueue push Kreuz Ass queue lt string gt size type n n myQueue size Weist die Anzahl der Elemente der Variablen n zu cout lt lt Die Lange der Queue ist lt lt n lt lt lt lt endl Ausgabe auf der Konsole string card myQueue front Weist das Element am Anfang Herz Dame der Variablen card zu cout lt lt Die Karte am Anfang der Queue ist lt lt card lt lt lt lt endl Ausgabe auf der Konsole myQueue pop Entfernt das Element am Anfang n myQueue size Weist die Anzahl der Elemente der Variablen n zu cout lt lt Nach dem Loschen der Karte ist die Lange lt lt n lt lt lt lt endl Ausgabe auf der Konsole card myQueue front Weist das Element am Anfang Karo Konig der Variablen card zu cout lt lt Nach dem Loschen ist die Karte am Anfang der Queue lt lt card lt lt lt lt endl Ausgabe auf der Konsole Eine mogliche Implementierung einer Warteschlange als einfach verkettete Liste ware Folgende ifndef QUEUE HPP define QUEUE HPP template lt typename T gt class Queue private struct Element T value Element next nullptr Element const T amp v value v Element head nullptr Element tail nullptr unsigned int numberOfElements 0 void clear while empty pop void copy const Queue amp arg Element ptr arg head while ptr nullptr push ptr gt value ptr ptr gt next public Queue default Queue const Queue amp arg copy arg Queue amp operator const Queue amp arg clear copy arg return this Queue clear void push const T amp arg if empty Nachdem das erste Element eingefugt wurde ist das vorderste Element gleich das hinterste Element head tail new Element arg else Das neue Element wird am Ende der Warteschlange eingefugt und wird zum hintersten Element tail gt next new Element arg tail tail gt next numberOfElements void pop Falls das vorderste Element gleich das hinterste Element ist befindet sich nur noch ein Element in der Warteschlange if head tail delete head head tail nullptr numberOfElements 0 else Das vorderste Element wird entfernt und das zweitvorderste Element wird zum vordersten Element Element tmp head head head gt next delete tmp numberOfElements T front const return head gt value bool empty const return head nullptr unsigned int size const return numberOfElements endif C Bearbeiten Das folgende Beispiel in der Programmiersprache C zeigt die Implementierung einer Warteschlange in der Klasse Queue und die Verwendung dieser Klasse in einer Hauptklasse Die Klasse Queue enthalt eine doppelt verkettete Liste die in diesem Beispiel ein generischer Typ mit einem Typparameter ist Deklariert die Klasse Queue mit Typparameter T die mit einer doppelt verketteten Liste implementiert ist public class Queue lt T gt Initialisiert die doppelt verkettete Liste der Queue private readonly System Collections Generic LinkedList lt T gt list new System Collections Generic LinkedList lt T gt Gibt die Anzahl der Elemente zuruck public int Count return list Count Fugt ein Element am Ende ein public void Enqueue T element list AddLast element Loscht das Element am Anfang und gibt es zuruck public T Dequeue T first list First Value list RemoveFirst return first Gibt die Queue als Text zuruck public String ToString return list ToString Die Hauptklasse Program mit der Methode Main ist entsprechend wie das Code Beispiel in C siehe oben implementiert class Program public static void Main string args Queue lt string gt myQueue new Queue lt string gt myQueue Enqueue Herz Dame myQueue Enqueue Karo Konig myQueue Enqueue Kreuz Ass int n myQueue Count Console WriteLine Die Lange der Queue ist n string card myQueue Dequeue Console WriteLine Die Karte am Anfang der Queue ist card n myQueue Count Console WriteLine Nach dem Loschen der Karte ist die Lange n card myQueue Dequeue Console WriteLine Nach dem Loschen ist die Karte am Anfang der Queue card Console ReadLine Fur die Programmierung von Kartenspielen und Gesellschaftsspielen mit Stapeln bei denen wahrend des Spiels Karten auf einen Stapel gelegt oder von einem Stapel gezogen wird sind stattdessen Stacks geeignet siehe Stapelspeicher Beispiel mit Spielkarten Siehe auch BearbeitenDatenstruktur Deque Last In First Out Puffer Pipe Informatik Stapelspeicher Warteschlange WarteschlangentheorieWeblinks Bearbeitenwww geeksforgeeks org Array implementation of queue Simple Einzelnachweise Bearbeiten Microsoft Docs queue Class Abgerufen von https de wikipedia org w index php title Warteschlange Datenstruktur amp oldid 227260388