Organisatorisches. Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Definition Feld. Definition Feld

Ähnliche Dokumente
Algorithmen und Datenstrukturen (für ET/IT)

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Feld als sequentielle Liste. Definition Feld

Wiederholung: Zusammenfassung Felder. Algorithmen und Datenstrukturen (für ET/IT) Definition Abstrakter Datentyp. Programm heute

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen (für ET/IT)

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Definition Feld. Feld als sequentielle Liste

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen (für ET/IT) Wiederholung: Ziele der Vorlesung. Wintersemester 2012/13. Dr. Tobias Lasser

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen (für ET/IT)

12. Dynamische Datenstrukturen

16. Dynamische Datenstrukturen

13. Dynamische Datenstrukturen

Stand der Vorlesung. Vergleich verkettete Liste und sequentielle Liste

Technische Universität München

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

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

Algorithmen und Datenstrukturen (für ET/IT)

1 Abstrakte Datentypen

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

SS10 Algorithmen und Datenstrukturen 2. Kapitel Fundamentale Datentypen und Datenstrukturen

Spezielle Datenstrukturen

11. Elementare Datenstrukturen

Übung Algorithmen und Datenstrukturen

8 Elementare Datenstrukturen

5.3 Doppelt verkettete Listen

Algorithmen I. Tutorium 1-3. Sitzung. Dennis Felsing

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

Algorithmen und Datenstrukturen (für ET/IT)

B2.1 Abstrakte Datentypen

Vorlesung Datenstrukturen

12.3 Ein Datenmodell für Listen

Fallstudie: Online-Statistik

Datentypen. strukturierte. elementare. skalare reelle statische dynamische int. list. real float. set. record. inhomogen. homogen

Übung Algorithmen und Datenstrukturen

ALP II Dynamische Datenmengen Datenabstraktion

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Algorithmen und Datenstrukturen

Abstrakte Datentypen und Datenstrukturen

Kapitel 4: Datentyp Keller und Schlange

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B3.1 Einführung. B3.2 Verkettete Liste. B3.3 Bäume

Algorithmen und Datenstrukturen

Informatik II, SS 2014

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Einführung in die Informatik I

Algorithmen und Datenstrukturen 1

Kapitel 3: Datentyp Keller und Schlange

Programmieren 2 15 Abstrakte Datentypen

Datenstrukturen Teil 1. Arrays, Listen, Stapel und Warteschlange. Arrays. Arrays. Array

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

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Übersicht: Graphen. Definition: Ungerichteter Graph. Definition: Ungerichteter Graph

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

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

7. Verkettete Strukturen: Listen

Informatik II Prüfungsvorbereitungskurs

Informatik II, SS 2016

Konkatenation zweier Listen mit concat

Organisatorisches. Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Definition Datenstruktur. Nächste Woche keine Vorlesung!

Algorithmen und Datenstrukturen (für ET/IT) Probeklausur. Sommersemester Dr. Stefanie Demirci

Nachtrag: Vergleich der Implementierungen von Stack

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Einführung in die Programmiertechnik

ADS: Algorithmen und Datenstrukturen

Logische Datenstrukturen

4.2 Daten und Datenstrukturen

Elementare Datenstrukturen

Technische Universität München SoSe 2018 Fakultät für Informatik, I Mai 2018 Dr. Stefanie Demirci

Algorithmen und Datenstrukturen 3. Vorlesung

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Programmieren I. Kapitel 13. Listen

Graphdurchmusterung, Breiten- und Tiefensuche

Einfügen immer nur am Kopf der Liste Löschen auch nur an einem Ende (2 Möglichkeiten!)

Advanced Programming in C

Abstrakte Datentypen und deren Implementierung in Python

3. Übungsblatt zu Algorithmen I im SoSe 2017

Vorlesung Datenstrukturen

Programmieren in Haskell Abstrakte Datentypen

6. Verkettete Strukturen: Listen

ContainerDatenstrukturen. Große Übung 4

Grundlagen: Algorithmen und Datenstrukturen

Einführung in die Informatik

Stack. Queue. pop() liefert zuletzt auf den Stack gelegtes Element und löscht es push( X ) legt ein Element X auf den Stack

C- Kurs 09 Dynamische Datenstrukturen

Listen. M. Jakob. 20. September Gymnasium Pegnitz

Informatik II, SS 2014

Einstieg in die Informatik mit Java

Aufgaben NF 11; Seite 1

Informatik II Übung, Woche 14

Algorithmen und Datenstrukturen (für ET/IT)

Übung Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen

Informatik II Prüfungsvorbereitungskurs

Listen. M. Jakob. Gymnasium Pegnitz. 20. September Hinführung: Wartenschlangen. Grundprinzip von Listen Rekursion

Schnittstellen, Stack und Queue

Datenstrukturen und Algorithmen. Vorlesung 8

Transkript:

Organisatorisches Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 208 Dr. Stefanie Demirci Computer Aided Medical Procedures Technische Universität München TUMonline-Einträge: Vorlesung https://campus.tum.de/tumonline/wblv. wbshowlvdetail?pstpspnr=950343342&psprachenr= Zentralübung: https://campus.tum.de/tumonline/wblv. wbshowlvdetail?pstpspnr=95035033&psprachenr= Tutorübung: https://campus.tum.de/tumonline/wblv. wbshowlvdetail?pstpspnr=950367835&psprachenr= Bitte melden Sie sich für alle Einträge an! 2 Programm heute Definition Feld Einführung 2 Grundlagen von Algorithmen 3 Grundlagen von Datenstrukturen Primitive Datentypen und Zahldarstellung Felder als sequentielle Liste Zeichen und Zeichenfolgen Felder als verkettete Liste Abstrakte Datentypen Stacks Queues Definition Feld Ein Feld A ist eine Folge von n Datenelementen (d i ) i=,...,n, A = d,d 2,...,d n mit n N 0. Die Datenelemente d i sind beliebige Datentypen (z.b. primitive). 3 4

Feld als sequentielle Liste Operationen auf sequentiellen Listen Repräsentation von Feld A als sequentielle Liste (oder Array) feste Anzahl n von Datenelementen zusammenhängend gespeichert in linearer Reihenfolge mit Index Zugriff auf i-tes Element über Index i: A[i]... Feld A: A[n-] A[n-2] A[2] A[] A[0] Sei A sequentielle Liste. Operationen: initialize: Initialisiere seq. Liste A mit n Elementen elementat(i): Zugriff auf i-tes Element von A: A[i] insert: füge Element in seq. Liste A ein (erfordert Umkopieren und evtl. Verlängern von A) erase: entferne Element aus seq. Liste A (erfordert Umkopieren) A[n-] A[n-2].... A[] A[0] 25 6 9 4 25 6 9 8 4 25 6 9 4 0 25 6 9 4 5 6 Feld als einfach verkettete Liste Verkettete Liste Repräsentation von Feld A als verkettete Liste dynamische Anzahl von Datenelementen in linearer Reihenfolge gespeichert (nicht notwendigerweise zusammenhängend!) mit Referenzen oder Zeigern verkettet Folge von miteinander verbundenen Elementen jedes Element d i besteht aus Daten: Wert des Feldes an Position i next: Referenz auf das nächste Element d i+ Node: Daten next auf Englisch: linked list 7 ist Referenz auf erstes Element des Feldes d letztes Element d n hat keinen Nachfolger symbolisiert durch -Referenz 8

Operationen auf verketteter Liste Zugriff auf Element i: beginne bei Referenz vorhangeln entlang next Referenzen bis zum i-ten Element Beispiel für i=3: Operationen auf verketteter Liste Löschen von Element i: Zugriff auf Element i- umhängen von next Referenz von Element i- auf Element i+ Beispiel für i=3: Hilfsreferenz Hilfsreferenz 9 0 Operationen auf verketteter Liste Einfügen von Element an Stelle i: Zugriff auf Element i- umhängen von next Referenz von Element i- auf neues Element next Referenz von neuem Element setzen auf altes Element i Beispiel für i=3: Hilfsreferenz Daten neues Element Gegenüberstellung sequentielle Liste und verkettete Liste Sequentielle Liste Direkter Zugriff auf i-tes Element sequentielles Durchlaufen sehr einfach statische Länge, kann Speicher verschwenden Einfügen/Löschen erfordert erheblich Kopieraufwand Verkettete Liste Zugriff auf i-tes Element erfordert i Iterationen sequentielles Durchlaufen sehr einfach dynamische Länge zusätzlicher Speicher für Zeiger benötigt Einfügen/Löschen einfach next 2

Feld als doppelt verkettete Liste Doppelt verkettete Liste Repräsentation von Feld A als doppelt verkettete Liste prev prev prev prev verkettete Liste stop jedes Element mit Referenzen doppelt verkettet prev prev prev prev stop Folge von miteinander verbundenen Elementen jedes Element d i besteht aus Daten: Wert des Feldes an Position i next: Referenz auf das nächste Element d i+ prev: Referenz auf das vorherige Element d i Node: prev Daten auf Englisch: doubly linked list next 3 /stop sind Referenzen auf erstes/letztes Element des Feldes 4 Operationen auf doppelt verketteter Liste Löschen von Element i: Zugriff auf Element i umhängen von next von Element i- auf Element i+ umhängen von prev von Element i+ auf Element i- Beispiel für i=3: prev prev prev prev letztes Element d n hat keinen Nachfolger symbolisiert durch -Referenz Operationen auf doppelt verketteter Liste Einfügen von Element an Stelle i: Zugriff auf Element i umhängen von next von Element i- auf neues Element, sowie umhängen von prev von altem Element i auf neues Element next bzw. prev von neuem Element setzen auf altes Element i bzw. Element i- Beispiel für i=3: prev prev prev prev stop stop prev Daten 5 next 6

Eigenschaften doppelt verkettete Liste Zusammenfassung Felder Ein Feld A kann repräsentiert werden als: Feld A als doppelt verkettete Liste Vorteile: Durchlauf in beiden Richtungen möglich Einfügen/Löschen potentiell einfacher, da man sich Vorgänger nicht extra merken muss Nachteile: zusätzlicher Speicher erforderlich für zwei Referenzen Referenzverwaltung komplizierter und fehleranfällig sequentielle Liste (array) mit fixer Länge verkettete Liste (linked list) mit dynamischer Länge doppelt verkettete Liste (doubly linked list) mit dynamischer Länge Eigenschaften: einfach und flexibel aber manche Operationen aufwendig 7 8 Programm heute Definition Abstrakter Datentyp Einführung 2 Grundlagen von Algorithmen 3 Grundlagen von Datenstrukturen Primitive Datentypen und Zahldarstellung Felder als sequentielle Liste Zeichen und Zeichenfolgen Felder als verkettete Liste Abstrakte Datentypen Stacks Queues Abstrakter Datentyp (englisch: abstract data type, ADT) Ein abstrakter Datentyp ist ein mathematisches Modell für bestimmte Datenstrukturen mit vergleichbarem Verhalten. Ein abstrakter Datentyp wird indirekt definiert über mögliche Operationen auf ihm sowie mathematische Bedingungen (oder: constraints) über die Auswirkungen der Operationen (u.u. auch die Kosten der Operationen). 9 20

Beispiel abstrakter Datentyp: abstrakte Variable Beispiel abstrakter Datentyp: abstrakte Liste (Teil ) Abstrakte Variable V ist eine veränderliche Dateneinheit mit zwei Operationen load(v) liefert einen Wert store(v, x) wobei x ein Wert ist und der Bedingung load(v) liefert immer den Wert x der letzten Operation store(v, x) Abstrakte Liste L ist ein Datentyp mit Operationen pushfront(l, x) liefert eine Liste front(l) liefert ein Element rest(l) liefert eine Liste und den Bedingungen ist x Element, L Liste, dann liefert front(pushfront(l, x)) das Element x. ist x Element, L Liste, dann liefert rest(pushfront(l, x)) die Liste L. 2 22 Beispiel abstrakter Datentyp: abstrakte Liste (Teil 2) Programm heute Abstrakte Liste L. Weitere Operationen sind isempty(l) liefert true oder false initialize() liefert eine Listen Instanz mit den Bedingungen initialize() L für jede Liste L (d.h. jede neue Liste ist separat von alten Listen) isempty(initialize()) == true (d.h. eine neue Liste ist leer) isempty(pushfront(l, x)) == false (d.h. eine Liste ist nach einem pushfront nicht leer) Einführung 2 Grundlagen von Algorithmen 3 Grundlagen von Datenstrukturen Primitive Datentypen und Zahldarstellung Felder als sequentielle Liste Zeichen und Zeichenfolgen Felder als verkettete Liste Abstrakte Datentypen Stacks Queues 23 24

Definition Stack Stack (oder deutsch: Stapel, Keller) Ein Stack ist ein abstrakter Datentyp. Er beschreibt eine spezielle Listenstruktur nach dem Last In First Out (LIFO) Prinzip mit den Eigenschaften löschen, einfügen ist nur am Ende der Liste erlaubt, nur das letzte Element darf manipuliert werden. Definition Stack Stack (oder deutsch: Stapel, Keller) Ein Stack ist ein abstrakter Datentyp. Er beschreibt eine spezielle Listenstruktur nach dem Last In First Out (LIFO) Prinzip mit den Eigenschaften löschen, einfügen ist nur am Ende der Liste erlaubt, nur das letzte Element darf manipuliert werden. Operationen auf Stacks: push: legt ein Element auf den Stack (einfügen) pop: entfernt das letzte Element vom Stack (löschen) top: liefert das letzte Stack-Element isempty: liefert true falls Stack leer initialize: Stack erzeugen und in szustand (leer) setzen neue Pizza "push" Pizza #3 Pizza #2 Pizza # 25 26 Definition Stack (exakter) Definition Stack (exakter, Teil 2) Stack S ist ein abstrakter Datentyp mit Operationen pop(s) liefert einen Wert push(s, x) wobei x ein Wert mit der Bedingung ist x Wert und V abstrakte Variable, dann ist die Sequenz push(s, x); store(v, pop(s)) äquivalent zu store(v, x) sowie der Operation top(s) liefert einen Wert mit der Bedingung ist x Wert und V abstrakte Variable, dann ist die Sequenz push(s, x); store(v, top(s)); äquivalent zu push(s, x); store(v, x) Stack S. Weitere Operationen sind isempty(s) liefert true oder false initialize() liefert eine Stack Instanz mit den Bedingungen initialize() S für jeden Stack S (d.h. jeder neue Stack ist separat von alten Stacks) isempty(initialize()) == true (d.h. ein neuer Stack ist leer) isempty(push(s, x)) == false (d.h. ein Stack nach push ist nicht leer) 27 28

Anwendungsbeispiele Stack Auswertung arithmetischer Ausdrücke Call-Stack bei Funktionsaufrufen Einfache Vorwärts- / Rückwärts Funktion in Software z.b. im Internet-Browser Syntaxanalyse eines Programms z.b. zur Erkennung von Syntax-Fehlern durch Compiler Auswertung arithmetischer Ausdrücke Gegeben sei ein vollständig geklammerter, einfacher arithmetischer Ausdruck mit Bestandteilen Zahl, +, *, = Beispiel: (3 * (4 + 5)) = Schema: arbeite Ausdruck von links nach rechts ab, speichere jedes Zeichen ausser ) und = in Stack S bei ) werte die 3 obersten Elemente von S aus, dann entferne die passende Klammer ( vom Stack S und speichere Ergebnis in Stack S bei = steht das Ergebnis im obersten Stack-Element von S 29 30 Implementation Stack Implementation Stack als sequentielle Liste Stack-Elemente speichern in sequentieller Liste A (Länge n) Stack ist abstrakter Datentyp. Implementation ist nicht festgelegt nur Operationen und Bedingungen sind festgelegt oberstes Stack-Element merken mittels Variable top falls Stack leer ist top == - n- n-2... 0 - Stack kann auf viele Arten implementiert werden, zum Beispiel als: sequentielle Liste verkettete Liste push(x) inkrementiert top und speichert x in A[top] pop() liefert A[top] zurück und dekrementiert top top() liefert A[top] zurück top 32 33

Implementation Stack als sequentielle Liste Implementation Stack als verkettete Liste n- n-2... 0 - initialize(); Stack-Elemente speichern in verketteter Liste L oberstes Stack-Element wird durch Referenz markiert top n- n-2... 0 9 4 - push(); push(4); push(9); top n- n-2... 0 9 4 - pop(); push(x) fügt Element an erster Position ein pop() liefert Element an erster Position zurück und entfernt es top() liefert Element an erster Position zurück top 34 35 Zusammenfassung Stack Programm heute Stack ist abstrakter Datentyp als Metapher für einen Stapel wesentliche Operationen: push, pop Implementation als sequentielle Liste fixe Größe (entweder Speicher verschwendet oder zu klein) push, pop sehr effizient Implementation als verkettete Liste dynamische Größe, aber Platz für Zeiger verschwendet push, pop sehr effizient Einführung 2 Grundlagen von Algorithmen 3 Grundlagen von Datenstrukturen Primitive Datentypen und Zahldarstellung Felder als sequentielle Liste Zeichen und Zeichenfolgen Felder als verkettete Liste Abstrakte Datentypen Stacks Queues 36 37

Definition Queue Definition Queue Queue (oder deutsch: Warteschlange) Eine Queue ist ein abstrakter Datentyp. Sie beschreibt eine spezielle Listenstruktur nach dem First In First Out (FIFO) Prinzip mit den Eigenschaften einfügen ist nur am Ende der Liste erlaubt, entfernen ist nur am der Liste erlaubt. Queue (oder deutsch: Warteschlange) Eine Queue ist ein abstrakter Datentyp. Sie beschreibt eine spezielle Listenstruktur nach dem First In First Out (FIFO) Prinzip mit den Eigenschaften einfügen ist nur am Ende der Liste erlaubt, entfernen ist nur am der Liste erlaubt. Person verlässt Schlange Person stellt sich an Operationen auf Queues: enqueue: fügt ein Element am Ende der Schlange hinzu dequeue: entfernt das erste Element der Schlange isempty: liefert true falls Queue leer initialize: Queue erzeugen und in szustand (leer) setzen 38 39 Definition Queue (exakter) Queue Q ist ein abstrakter Datentyp mit Operationen dequeue(q) liefert einen Wert enqueue(q, x) wobei x ein Wert isempty(q) liefert true oder false Beispiel: Queue Q: Q: Q = initialize(); enqueue(); initialize liefert eine Queue Instanz und mit Bedingungen ist x Wert, V abstrakte Variable und Q eine leere Queue, dann ist die Sequenz enqueue(q, x); store(v, dequeue(q)) äquivalent zu store(v, x) Q: Q: 2 2 3 enqueue(2); enqueue(3); sind x,y Werte, V abstrakte Variable und Q eine leere Queue, dann ist die Sequenz enqueue(q, x); enqueue(q, y); store(v, dequeue(q)) äquivalent zu store(v, x); enqueue(q, y) initialize() Q für jede Queue Q isempty(initialize()) == true isempty(enqueue(q, x)) == false Q: Q: 2 3 3 dequeue(); dequeue(); 40 4

Anwendungsbeispiele Queue Anwendungsbeispiel Stack und Queue Druckerwarteschlange Playlist von itunes (oder ähnlichem Musikprogramm) Kundenaufträge bei Webshops Warteschlange für Prozesse im Betriebssystem (Multitasking) Palindrom Ein Palindrom ist eine Zeichenkette, die von vorn und von hinten gelesen gleich bleibt. Beispiel: Reittier Erkennung ob Zeichenkette ein Palindrom ist ein Stack kann die Reihenfolge der Zeichen umkehren eine Queue behält die Reihenfolge der Zeichen 42 43 Palindrom Erkennung Implementation Queue Algorithmus: Eingabe: Zeichenkette k durchlaufe k von links nach rechts füge dabei jedes Zeichen in Stack S (push) und Queue Q (enqueue) ein leere den Stack S (pop) und die Queue Q (dequeue) und vergleiche die Zeichen falls die Zeichen nicht gleich sind, ist k kein Palindrom ansonsten ist k Palindrom Ausgabe: k ist Palindrom oder nicht Zeichenkette k: RADAR Queue Q: Stack S: R A D A R R A D A R top Auch Queue ist abstrakter Datentyp. Implementation ist nicht festgelegt nur Operationen und Bedingungen sind festgelegt Queue kann auf viele Arten implementiert werden, zum Beispiel als: verkettete Liste sequentielle Liste 44 45

Implementation Queue als verkettete Liste Queue-Elemente speichern in verketteter Liste L der Queue wird durch anfang Referenz markiert Ende der Queue wird durch extra ende Referenz markiert Implementation Queue als sequentielle Liste Queue-Element speichern in sequentieller Liste L (Länge n) der Queue wird durch Index anfang markiert Ende der Queue wird durch Index ende markiert anfang ende n- n-2... 2 0 5 8 0 NULL ende anfang enqueue(x) fügt Element bei ende Referenz ein dequeue() liefert Element bei anfang Referenz zurück und entfernt es enqueue(x) fügt Element bei Index ende+ ein dequeue liefert Element bei Index anfang zurück und entfernt es durch Inkrement von anfang 46 47 Implementation Queue als sequentielle Liste 2 Implementation Queue als zwei Stacks Problem: n- n-2... 2 0 5 8 0 Queue Q kann mittels zwei Stacks implementiert werden erster Stack inbox wird für enqueue benutzt: Q.enqueue(x) resultiert in inbox.push(x) wird nach ein paar Operationen zu ende n- n-2... 2 anfang 0 zweiter Stack outbox wird für dequeue benutzt: falls outbox leer, kopiere alle Elemente von inbox zu outbox: outbox.push( inbox.pop() ) Q.dequeue liefert outbox.pop() zurück 47 3 ende anfang enqueue dequeue Linksdrift! 3 2 2 Lösungsansatz: zirkuläre sequentielle Liste. 3 inbox outbox inbox outbox 48 49

Zusammenfassung Queue Zusammenfassung Queue ist abstrakter Datentyp als Metapher für eine Warteschlange wesentliche Operationen: enqueue, dequeue Implementation als verkettete Liste dynamische Größe, aber Platz für Referenzen verschwendet enqueue, dequeue sehr effizient Implementation als sequentielle Liste fixe Größe (entweder Speicher verschwendet oder zu klein) enqueue, dequeue sehr effizient Queue sehr schnell voll durch Linksdrift (ist aber durch zirkuläre sequentielle Liste lösbar) Einführung 2 Grundlagen von Algorithmen 3 Grundlagen von Datenstrukturen Primitive Datentypen und Zahldarstellung Felder als sequentielle Liste Zeichen und Zeichenfolgen Felder als verkettete Liste Abstrakte Datentypen Stacks Queues 50 5