ID1020: Stackar och Köer



Relevanta dokument
Föreläsning 3. Stack

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 3. Stack

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning 4 Innehåll

Föreläsning 2. Länkad lista och iterator

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Länkade strukturer. (del 2)

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning Datastrukturer (DAT036)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Föreläsning 2. Länkad lista och iterator

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Tentamen i Algoritmer & Datastrukturer i Java

Generisk klass med typparameter Inre klass - ListIterator

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Tommy Färnqvist, IDA, Linköpings universitet

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Stackar, köer, iteratorer och paket

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Föreläsning 8: Exempel och problemlösning

Föreläsning 10. ADT:er och datastrukturer

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Länkade strukturer, parametriserade typer och undantag

Tentamen i Algoritmer & Datastrukturer i Java

Lösningsförslag till exempeltenta 2

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Tentamen i Algoritmer & Datastrukturer i Java

Arrayer. results

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 4 Datastrukturer (DAT037)

2. Palindrom. Exempel: 1,2,3,2,1 är ett palindrom, och även 0, men inte 1,2,3,1,2,3.

Sammansatta datatyper Generics: Parametrisk polymorfism

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Föreläsning 2 Datastrukturer (DAT037)

Programmering för språkteknologer II, HT2014. Rum

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Tommy Färnqvist, IDA, Linköpings universitet

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Länkade listor, stackar och köer

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Samlingar Collection classes

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Föreläsning Datastrukturer (DAT036)

Föreläsning 11. ADT:er och datastrukturer

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

LULEÅ TEKNISKA UNIVERSITET

Föreläsning Datastrukturer (DAT036)

Tentamen i Algoritmer & Datastrukturer i Java

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Övning 1 - Abstrakta datatyper

Föreläsning 1 Datastrukturer (DAT037)

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

DAT043 Objektorienterad Programmering

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Laboration A Objektsamlingar

DAT043 - föreläsning 8

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Den som bara har en hammare tror att alla problem är spikar

ID1020: Union-Find. Dr. Jim Dowling kap Slides adapted from Algorithms 4 th Edition, Sedgewick.

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

So far... For recursive and iterative programs. Bubble, insertion, selection, quick, merge, counting

Föreläsning 12. Länkade listor

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Samlingar Collection classes

Repetition av OOP- och Javabegrepp

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Classes och Interfaces, Objects och References, Initialization

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Tentamen Programmering fortsättningskurs DIT950

TDDC30 Programmering i Java, datastrukturer och algoritmer

BST implementering, huvudstruktur

Transkript:

ID1020: Stackar och Köer Dr. Jim Dowling jdowling@kth.se kap. 1.3 Slides adapted from Algorithms 4 th Edition, Sedgewick.

Stackar och köer Grundläggande datatyper. - Kollektion (collection) av objekt. - Operationer: insert, remove, iterate, testa om null (if empty). - Det är uppenbart hur man lägger till (insert) ett objekt. - Men, vilket element tar man bort (remove)? stack push pop queue enqueue dequeue Stack. Examinera elementet most recently added Kö. Examinera elementet least recently added. LIFO = "last in first out" FIFO = "first in first out" 2

Klient, implementation, interface Separar interface och implementation. T.ex. stack, queue, bag, priority queue, symbol table, union-find,. Fördelar. - Klienten får inte veta detaljer om implementationen => klienten får välja från flera olika implementationer. - Implementationen får inte veta detaljer om klientens behov => många klienter kan återanvända samma implementationen. - Design: skapar modular, återanvändbara bibliotek. - Prestanda: använd en optimerade implementation när den behövs. Klient: Implementation: Interface: programmera med operationer definierade i interface:n. kod som implementerar operationerna och datastrukturer. beskrivningen av grundläggande operationer. 3

bags, stackar ock köer

Stack API Exempel API. Stack av String datatyp. public class StackOfStrings push pop StackOfStrings( ) void push(string item) String pop() boolean isempty() int size() create an empty stack insert a new string onto stack remove and return the string most recently added is the stack empty? number of strings on the stack Exempel klient. Omvänd sekvens av strängar från standard input. 5

Hur implementerar man en stack med en länkad lista? A. Det går inte att implementera med en enkellänkad lista på ett effektivt sätt. toppen av stacken B. it was the best of null toppen av stacken C. of best the was it null 8

Stack: länkad lista implementation Spara pekare first till första noden i en enkellänkad lista. Push ett nytt element innan first och uppdatera first. Pop ett nytt element från first. toppen av stacken of best the was it null first 9

Stack pop: länkad lista implementation 1

Stack push: länkad lista implementation

Stack: länkad lista implementation i Java public class LinkedStackOfStrings { private Node first = null; private class Node { String item; Node next; public boolean isempty() { return first == null; innre klass (access modifiers spelar ingen roll för attributer i en innre klass) public void push(string item) { Node oldfirst = first; first = new Node(); first.item = item; first.next = oldfirst; public String pop() { String item = first.item; first = first.next; return item; 1

Stack: länkad lista implementation prestanda Sats. Varje operation tar konstant tid i worst case. Sats. En stack med N element använder ~ 40 N bytes. inner class private class Node { String item; Node next; 16 bytes (object overhead) 8 bytes (inner class extra overhead) 8 bytes (reference to String) 8 bytes (reference to Node) 40 bytes per stack node Anmärkning. Beräkningen inkluderar bara minnet av stacken (inte minnet som behövs för strängerna själva, som klienten äger). 1

Hur implementerar man en fixed-kapacitet stack med en array? Det går inte att implementera med en array på ett effektivt sätt. toppen av stacken B. it was the best of time s null null null null 0 1 2 3 4 5 6 7 8 9 toppen av stacken C. time of best the was it null null null null s 0 1 2 3 4 5 6 7 8 9 1

Fixed-kapacitet stack: array implementation Använd en array s[] för att lagra N poster på stacken. - push(): lägg till en ny post vid s[n]. - pop(): tar bort från s[n-1]. toppen av stacken s[] it was the best of times null null null null 0 1 2 3 4 5 6 7 8 9 N kapacitet = 10 Defekt. Stack-overflow inträffar när N är större än kapacitet. 1

Fixed-kapacitet stack: array implementation public class FixedCapacityStackOfStrings { private String[] s; private int N = 0; public FixedCapacityStackOfStrings(int capacity) { s = new String[capacity]; public boolean isempty() { return N == 0; används för att indexera in i array:en: sedan för att inkrementera N public void push(string item){ s[n++] = item; public String pop() { return s[--n]; decrement N; sedan används för att indexera in i array 1

Att tänka på... Overflow och underflow. - Underflow: kasta en exception om klienten anropar pop på en tom stack. - Overflow: använd en resizing array för array implementationen. Null element: det är tillåtet att lägga till ett null element. Loitering. Loitering (söla) händer när någon objekt behåller en referens till ett annat objekt när referensen inte längre behövs. public String pop() { return s[--n]; //Vi glömde nollställa s[n]! loitering public String pop() { String item = s[--n]; s[n] = null; return item; Denna version undviker loitering. Garbage collectorn kan bara få tillbaka minnet från ett objekt om det inte längre finns referenser kvar till objektet. 1

Stackar: resizing arrayer

Stack: resizing-array implementation Problem. API:et är trasig om det behöver klienten att specificera kapaciteten! Hur ökar och minskar man storleken (dvs. längden) av array:n? Första försöket. - push(): öka storleken av array s[] med 1. - pop(): minska storleken av array s[] med 1. För dyrt. omöjlig för stort N - Vi behöver kopiera alla element till en ny array för varje push operation. Antal array accesser för att lägga till första N element = N + (2 + 4 + + 2(N 1)) ~ N 2. 1 array access per push 2(k 1) array accesser för att öka längden med k (ignorera kostnaden att skapa den nya array:n) Utmaning. Skriva om programmet så att array "resizing" sällan inträffer. 2

Stack: resizing-array implementation Hur kan man öka storleken av array:n? "repeated doubling" Om array:n är full, skapa en ny array två gånger större, och kopiera elementen. public ResizingArrayStackOfStrings() { s = new String[1]; public void push(string item) { if (N == s.length) resize(2 * s.length); s[n++] = item; private void resize(int capacity) { String[] copy = new String[capacity]; for (int i = 0; i < N; i++) { copy[i] = s[i]; s = copy; Resultat: att lägga till första N element tar tid proportionellt mot N inte N 2

Stack: resizing-array implementation Hur minskar man storlekan av array:n? Första försöket. - push(): fördubbla storlekan av array s[] när array är full. - pop(): halvera storlekan av array s[] när array är halv-full. För dyrt i worst case. - Överväga push-pop-push-pop- sekvensen när array:n är full. - Varje operation tar tid proportionell mot N. N = 5 to be or not to null null null N = 4 to be or not N = 5 to be or not to null null null N = 4 to be or not 2

Stack: resizing-array implementation Hur minskar man storlekan av array:n? Effektiv lösning. - push(): fördubbla storlekan av array s[] när array är full. - pop(): halvera storlekan av array s[] när array är en kvart-full. public String pop() { String item = s[--n]; s[n] = null; if (N > 0 && N == s.length/4) { resize(s.length/2); return item; Invariant. array s[] är nu mellan 25% och 100% full. 2

2 6 Stack resizing-array implementation: prestanda Amorterad analys. Börja från en tom datastruktur, medel körtiden per operation över en worst-case sekvens av operationer. Sats. Om man börjar med en tom stack, alla möjliga sekvenser av M push och pop operationer tar tid proportionell mot M. best worst amortized construct 1 1 1 push 1 N 1 pop 1 N 1 fördubbling och halvering operationer size 1 1 1 Ökningen av körtiden när man kör resize på en stack med N element

Stack resizing-array implementation: minneskomplexitet Sats. Använder mellan ~ 8 N och ~ 32 N bytes för att representera en stack med N element. ~ 8 N när full. ~ 32 N när en kvart full. public class ResizingArrayStackOfStrings { private String[] s; private int N = 0; 8 bytes (referns till array) 24 bytes (array overhead) 8 bytes array storlek 4 bytes (int) 4 bytes (padding) Anmärkning. Beräkningen inkluderar bara minnet av stacken (inte minnet som behövs för strängerna själv, som klienten äger). 2

Stack implementations: resizing array vs. länkad lista Tradeoffs. Man kan implementera en stack med antingen en resizing array eller en länkad lista; klient kan byta ut den ena mot den andra. Vilken är bättre? Länka lista implementation. - Varje operation tar konstant tid i worst case. - Använder extra tid och minne för att hantera länkerna. Resizing-array implementation. - Varje operation tar konstant amorterad tid. - Mindre slösseri med minne.

Resizing arrayer: köer

Queue (kö) API enqueue public class QueueOfStrings QueueOfStrings() create an empty queue void enqueue(string item) insert a new string onto queue String dequeue() boolean isempty() int size() remove and return the string least recently added is the queue empty? number of strings on the queue dequeue 3

Hur implementeras en kö med en läknad lista? A. Det går inte att implementera med en enkellänkad lista på ett effektivt sätt. B. back of queue front of queue times of best the was it null C. front of queue back of queue it was the best of times null 3

Kö: länkad lista implementation - Spara en pekare first till första noden i en enkellänkad lista. - Spara en till pekare last till sista noden. - Dequeue (ta bort) från first. - Enqueue (lägg till) efter last. front of queue back of queue it was the best of times null first last 3

Kö dequeue: länkad lista implementation innre klass private class Node { String item; Node next; Anmärkning. Samma kod som länkad lista stack pop(). 3

Kö enqueue: länkad lista implementation innre klass private class Node { String item; Node next; 3

Kö: länkad lista implementation in Java public class LinkedQueueOfStrings { private Node first, last; private class Node { /* same as in LinkedStackOfStrings */ public boolean isempty() { return first == null; public void enqueue(string item) { Node oldlast = last; last = new Node(); last.item = item; last.next = null; if (isempty()) { first = last; else { oldlast.next = last; public String dequeue() { String item = first.item; first = first.next; if (isempty()) { last = null; return item; specialla fall för tomma köer 3

Hur implementerar man en fixed-kapacitet kö med en läknad lista? A. Det går inte att implementera med en enkellänkad lista på ett effektivt sätt. front of queue back of queue B. it was the best of times null null null null 0 1 2 3 4 5 6 7 8 9 back of queue front of queue C. times of best the was it null null null null 0 1 2 3 4 5 6 7 8 9 3

Kö: resizing-array implementation Använd array q[] för att lagra element i kön. enqueue(): lägg till ett nytt element vid q[tail]. dequeue(): ta bort ett element från q[head]. Uppdatera head och tail modulo kapacitetet. Lägg till en resizing array". front of queue back of queue q[] null null the best of times null null null null 0 1 2 3 4 5 6 7 8 9 head tail capacity = 10 Hur implementerar man resize operationen? 4

generics

Parameterized stack Vi har implementerad: StackOfStrings. Vi vill också ha: StackOfURLs, StackOfInts, StackOfVans,. Försök 1. Implementera en separat stack klass för varje typ. - Att skriva om koden är jobbig och kan lätt introducera buggar. - Att underhålla kopiera-och-klistra kod är jobbig och kan lätt introducera buggar. 4

Parameterized stack Vi har implementerad: StackOfStrings. Vi vill också ha: StackOfURLs, StackOfInts, StackOfVans,. Försök 2. Implementera en stack med element av typ Object. - Klienten behöver kasta från Object typen till mål typen. - Att kasta kan lätt introducera buggar: körtidsfel (runtime error) om typerna inte matcha varandra. StackOfObjects s = new StackOfObjects(); Apple a = new Apple(); Orange b = new Orange(); s.push(a); ClassCastException s.push(b); a = (Apple) (s.pop()); 4

Parameterized stack Vi har implementerad: StackOfStrings. Vi vill också ha: StackOfURLs, StackOfInts, StackOfVans,. Attempt 3. Java generics. - Unvik att kasta i klienten. - Upptäck type mismatch vid kompileringstiden istället för körtiden. typ parameter Stack<Apple> s = new Stack<Apple>(); Apple a = new Apple(); Orange b = new Orange(); s.push(a); s.push(b); kompileringsfel a = s.pop(); Fördel. Kompileringsfel är bättre än körtidsfel. 4

Generic stack: länkad lista implementation public class LinkedStackOfStrings { private Node first = null; private class Node { String item; Node next; public boolean isempty() { return first == null; public void push(string item) { Node oldfirst = first; first = new Node(); first.item = item; first.next = oldfirst; public String pop() { String item = first.item; first = first.next; return item; public class Stack<Item> { private Node first = null; private class Node { Item item; Node next; public boolean isempty() { return first == null; public void push(item item) { Node oldfirst = first; first = new Node(); first.item = item; first.next = oldfirst; public Item pop() { Item item = first.item; first = first.next; return item; generic -typ 4

Generic stack: array implementation @#$*! generic arrayer är inte tillåtet i Java public class FixedCapacityStackOfStrings{ private String[] s; private int N = 0; public class FixedCapacityStack<Item>{ private Item[] s; private int N = 0; public StackOfStrings(int capacity) { s = new String[capacity]; public boolean isempty() { return N == 0; public void push(string item) { s[n++] = item; public String pop() { return s[--n]; public FixedCapacityStack( int capacity) { s = new Item[capacity]; public boolean isempty() { return N == 0; public void push(item item) { s[n++] = item; public Item pop() { return s[--n]; 4

Generic stack: array implementation Ugh. Vi kaster här. public class FixedCapacityStackOfStrings{ private String[] s; private int N = 0; public class FixedCapacityStack<Item> { private Item[] s; private int N = 0; public StackOfStrings(int capacity) { s = new String[capacity]; public boolean isempty() { return N == 0; public void push(string item) { s[n++] = item; public String pop() { return s[--n]; public FixedCapacityStack( int capacity) { s = (Item[]) new Object[capacity]; public boolean isempty() { return N == 0; public void push(item item) { s[n++] = item; public Item pop() { return s[--n]; 4

Unchecked Cast % javac FixedCapacityStack.java Note: FixedCapacityStack.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. % javac -Xlint:unchecked FixedCapacityStack.java FixedCapacityStack.java:26: warning: [unchecked] unchecked cast found : java.lang.object[] required: Item[] a = (Item[]) new Object[capacity]; ^ 1 warning Varför behöver jag kasta i Java (eller använda reflektion)? Kort svar. bakåtkompatibilitet. Långt svar. Vi behöver diskutera type erasure och covariant arrayer. 4

Generic-datatyper: autoboxing Generics funkar inte med primitivtyper. Vad gör man med primitivtyper? Wrapper-typ. - Varj primitivtyp har en wrapper object typ. - T.ex.: Integer är en wrappertyp för int. Autoboxing är en automatisk kast mellan en primitivtyp och sin wrapper. Stack<Integer> s = new Stack<Integer>(); s.push(17); int a = s.pop(); // s.push(integer.valueof(17)); // int a = s.pop().intvalue(); Resultat. Klient code kan använda en generic stack för alla datatyper. 51

Iteratorer

Iteration Design utmaning: Hur kan vi stödja iteration över element i en stack, utan att avslöja den interna representationen av stacken? s[] it was the bes t i N of times null null null null 0 1 2 3 4 5 6 7 8 9 first current of best the was times it null Java lösningen. Skriv stack klassen så att den implementerar java.lang.iterable interface. 5

Iteratorer Vad är en Iterable? En inferface med en metod som returnerar en Iterator. Vad är en Iterator? En inferface med metoderna hasnext() och next(). Varför designer man datastrukturer som är Iterable? Java stödjer eleganta klient kod. java.lang.iterable interface public interface Iterable<Item> { Iterator<Item> iterator(); java.util.iterator interface public interface Iterator<Item> { boolean hasnext(); Item next(); void remove(); optional; use at your own risk foreach statement (shorthand) for (String s : stack){ StdOut.println(s); equivalent code (longhand) Iterator<String> i = stack.iterator(); while (i.hasnext()) { String s = i.next(); StdOut.println(s); 5

Stack iterator: länkad lista implementation import java.util.iterator; public class Stack<Item> implements Iterable<Item> {... public Iterator<Item> iterator() { return new ListIterator(); private class ListIterator implements Iterator<Item> { private Node current = first; public boolean hasnext() { return current!= null; public void remove() { /* not supported */ public Item next() { Item item = current.item; kasta UnsupportedOperationException current = current.next; return item; kasta NoSuchElementException om inga items finns kvar first current of best the was times it null 5

Stack iterator: array implementation import java.util.iterator; public class Stack<Item> implements Iterable<Item> { public Iterator<Item> iterator() { return new ReverseArrayIterator(); private class ReverseArrayIterator implements Iterator<Item> { private int i = N; public boolean hasnext() { return i > 0; public void remove() { /* not supported */ public Item next() { return s[--i]; i N s[] it was the best of times null null null null 0 1 2 3 4 5 6 7 8 9 5

Iteration: concurrent modifieringar Vad händer om klienten modifierar datastrukturen medans vi itererar över den? En fail-fast" iterator kaster en java.util.concurrentmodificationexception. for (String s : stack) { stack.push(s); A Hur kan man upptäcka concurrent modifieringar med en iterator? - Räkna antal push() och pop() operationer i Stack. - Spara sammanräkningar i en Iterator subklass när instanser skapas. - Om, när vi anropar next() eller hasnext(), och de nuvarande sammanräkningar inte likar de nuvarende räkningar, kaster man en exception. 5

Applikationer

Java collections bibliotek List interface. java.util.list är ett API för en sekvens av element. public interface List<Item> implements Iterable<Item> List() boolean isempty() int size() void add(item item) Item get(int index) Item remove(int index) boolean contains(item item) Iterator<Item> iterator() create an empty list is the list empty? number of items append item to the end return item at given index return and delete item at given index does the list contain the given item? iterator over all items in the list... Implementations. java.util.arraylist använder en resizing array; java.util.linkedlist använder en länkad lista. 6

Java collections bibliotek java.util.stack - Den stöder push(), pop(), och iteration. - Den subklasser java.util.vector, som i sin tur implementerar java.util.list interface, inklusiv get() och remove() metoderna. - Stack API:t är ett för-bred och dålig designad API (varför?) Java 1.3 bug report (June 27, 2001) The iterator method on java.util.stack iterates through a Stack from the bottom up. One would think that it should iterate as if it were popping off the top of the Stack. status (closed, will not fix) It was an incorrect design decision to have Stack extend Vector ("is-a" rather than "hasa"). We sympathize with the submitter but cannot fix this because of compatibility. 6

Java collections bibliotek java.util.stack. - Den stöder push(), pop(), och iteration. - Den subklasser java.util.vector, som i sin tur implementerar java.util.list interface, inklusiv get() och remove() metoderna. java.util.queue. Ett interface, inte en implementation av en kö. Bästa praxis i ID1020. Återanvänd implementationer av Stack, Queue, och Bag från kursboken. 6

Stack applikationer - Parsing i en kompilator - Java virtuell maskin. - Undo i MS-Word. - Back knapp i en Web browser. - Implementeringen av funktionsanrop i en kompilatorn. -... 6

Funktionsanrop Hur en kompilator implementerar en function. - Funktionsanrop: push lokala stackframe och returadress. - Returnera: pop returnera adressen och den lokala stackframe. Rekursiv funktion. En funktion som anropar sig själv. Anmärkning. Kan alltid använda en explicit stack för att ta bort rekursion. gcd (216, 192) p = 216, q = 192 static int gcd(int p, int q) { if (q == 0) return p; else return gcd(q, p % q); gcd (192, 24) p = 192, q = 24 static int gcd(int p, int q) { if (q == 0) return p; gcd (24, 0) p = 24, q = 0 else return gcd(q, p % q); static int gcd(int p, int q) { if (q == 0) return p; else return gcd(q, p % q); 6

Aritmetisk funktion utvärdering Mål. Utvärdera infix uttryck. operand stack operator stack ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) operand operatorn Två-stack algoritm. [E. W. Dijkstra] - Värde: lägg på operand-stack. - Operator: lägg på operator stack. - Vänster parentes: ignorera. - Höger parentes: pop operator och två operander; lägg resultaten man får när man kör operatorn med dem två värden som ligger på operand stacken. Kontext. En interpreter! 6

Dijkstra's två stack algoritm demo infix expression value stack operator stack (fully parenthesized) ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) operand operator 6

public class Evaluate { Dijkstra's två stack algoritm: aritmetisk funktion utvärdering public static void main(string[] args) { Stack<String> ops = new Stack<String>(); Stack<Double> vals = new Stack<Double>(); while (!StdIn.isEmpty()) { String s = StdIn.readString(); if (s.equals("(")) ; // do nothing else if (s.equals("+")) else if (s.equals("*")) else if (s.equals(")")) { String op = ops.pop(); if ops.push(s); ops.push(s); (op.equals("+")) vals.push(vals.pop() + vals.pop()); else if (op.equals("*")) vals.push(vals.pop() * vals.pop()); else vals.push(double.parsedouble(s)); StdOut.println(vals.pop()); % java Evaluate ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 101.0 6

Korrekthet Varför är algoritmen korrekt? När algoritmen möter en operator omgiven av två värden inom parenteser, lägger den resultatet på operand stacken. ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) som original input hade varit: ( 1 + ( 5 * ( 4 * 5 ) ) ) Upprepa argumenten: ( 1 + ( 5 * 20 ) ) ( 1 + 100 ) 101 Bygge ut. Flera operationer, ordning av operator, associativity. 7

Stack-based programming languages Observation 1. Dijkstra's två-stack algoritm berkäknar samma värde om operatorn kommer efter de två värden. ( 1 ( ( 2 3 + ) ( 4 5 * ) * ) + ) Observation 2. Alla paranteser är redundant! 1 2 3 + 4 5 * * + Jan Lukasiewicz Slutsatsen. Postfix eller "omvänd Polish" notation. 7