11.2 keller (stacks)seidl/courses/ss2011/info1/i11.pdf · 11.2 keller (stacks) operationen: boolean...
TRANSCRIPT
![Page 1: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/1.jpg)
11.2 Keller (Stacks)
Operationen:
boolean isEmpty() : testet auf Leerheit;
int pop() : liefert oberstes Element;
void push(int x) : legt x oben auf dem Keller ab;
String toString() : liefert eine String-Darstellung.
Weiterhin müssen wir einen leeren Keller anlegen können.
400
![Page 2: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/2.jpg)
Modellierung:
() : booleanisEmpty+(x: int) : voidpush+() : intpop+
()Stack+
Stack
401
![Page 3: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/3.jpg)
Erste Idee:
• Realisiere Keller mithilfe einer Liste!
1 2 3 4
l
• Das Attribut l zeigt auf das oberste Element.
402
![Page 4: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/4.jpg)
Modellierung:
() : booleanisEmpty+(x: int) : voidpush+() : intpop+
()Stack+ nextinfo : int
ListStack
+
List+ (int x, List l)
− +l
Die gefüllte Raute besagt, dass die Liste nur von Stack aus
zugreifbar ist.
403
![Page 5: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/5.jpg)
Implementierung:
public class Stack {
private List l;
// Konstruktor:
public Stack() {
l = null;
}
// Objekt-Methoden:
public isEmpty() {
return List.isEmpty(l);
}
...
404
![Page 6: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/6.jpg)
public int pop() {
int result = l.info;
l = l.next;
return result;
}
public void push(int a) {
l = new List(a,l);
}
public String toString() {
return List.toString(l);
}
} // end of class Stack
405
![Page 7: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/7.jpg)
• Die Implementierung ist sehr einfach;
• ... nutzte gar nicht alle Features von List aus;
• ... die Listen-Elemente sind evt. über den gesamten Speicher
verstreut;
==⇒ führt zu schlechtem ↑Cache-Verhalten des Programms
!
Zweite Idee:
• Realisiere den Keller mithilfe eines Felds und eines
Stackpointers, der auf die oberste belegte Zelle zeigt.
• Läuft das Feld über, ersetzen wir es durch ein größeres.
406
![Page 8: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/8.jpg)
• Die Implementierung ist sehr einfach;
• ... nutzte gar nicht alle Features von List aus;
• ... die Listen-Elemente sind evt. über den gesamten Speicher
verstreut;
==⇒ führt zu schlechtem ↑Cache-Verhalten des Programms
!
Zweite Idee:
• Realisiere den Keller mithilfe eines Felds und eines
Stackpointers, der auf die oberste belegte Zelle zeigt.
• Läuft das Feld über, ersetzen wir es durch ein größeres.
407
![Page 9: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/9.jpg)
1 2 3a
sps
s.push(4);
408
![Page 10: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/10.jpg)
1 2 3 4
sp
a
s
s.push(5);
409
![Page 11: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/11.jpg)
1 2 3 4a
sps
410
![Page 12: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/12.jpg)
1 2 3 4
sp
a
s
411
![Page 13: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/13.jpg)
1 2 3 4 5
sp
a
s
412
![Page 14: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/14.jpg)
Modellierung:
length+ : int
Array
() : booleanisEmpty+(x: int) : voidpush+() : intpop+
()Stack+
Stack
sp : int−a−
int
413
![Page 15: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/15.jpg)
Implementierung:
public class Stack {
private int sp;
private int[] a;
// Konstruktoren:
public Stack() {
sp = -1; a = new int[4];
}
// Objekt-Methoden:
public boolean isEmpty() {
return (sp<0);
}
...
414
![Page 16: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/16.jpg)
public int pop() {
return a[sp--];
}
public void push(int x) {
++sp;
if (sp == a.length) {
int[] b = new int[2*sp];
for(int i=0; i<sp; ++i) b[i] = a[i];
a = b;
}
a[sp] = x;
}
public toString() {...}
} // end of class Stack
415
![Page 17: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/17.jpg)
Nachteil:
• Es wird zwar neuer Platz allokiert, aber nie welcher freigegeben.
Erste Idee:
• Sinkt der Pegel wieder auf die Hälfte, geben wir diese frei ...
416
![Page 18: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/18.jpg)
1 2 3 4 5
sp
a
x=s.pop();
x
s
417
![Page 19: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/19.jpg)
1 2 3 4
5
a
sp
s.push(6);
x
418
![Page 20: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/20.jpg)
5
41 2 3 6a
sp
x = s.pop();
x
s
419
![Page 21: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/21.jpg)
41 2 3
6
sp
a
s.push(7);
x
s
420
![Page 22: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/22.jpg)
41 2 3
6
7a
sp
x = s.pop();
x
s
421
![Page 23: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/23.jpg)
• Im schlimmsten Fall müssen bei jeder Operation sämtliche
Elemente kopiert werden.
Zweite Idee:
• Wir geben erst frei, wenn der Pegel auf ein Viertel fällt – und
dann auch nur die Hälfte !
422
![Page 24: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/24.jpg)
1 2 3
sp
a
x = s.pop();
x
s
423
![Page 25: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/25.jpg)
1 2
3
a
sp
s.push(4);
x
s
424
![Page 26: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/26.jpg)
1 2
3
4
sp
a
s.push(5);
x
s
425
![Page 27: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/27.jpg)
1 2
3
4 5a
sp
x
s
426
![Page 28: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/28.jpg)
• Vor jedem Kopieren werden mindestens halb so viele
Operationen ausgeführt, wie Elemente kopiert werden.
• Gemittelt über die gesamte Folge von Operationen werden pro
Operation maximal zwei Zahlen kopiert ↑amortisierte
Aufwandsanalyse.
427
![Page 29: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/29.jpg)
public int pop() {
int result = a[sp];
if (sp == a.length/4 && sp>=2) {
int[] b = new int[2*sp];
for(int i=0; i < sp; ++i)
b[i] = a[i];
a = b;
}
sp--;
return result;
}
428
![Page 30: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/30.jpg)
11.3 Schlangen (Queues)
(Warte-) Schlangen verwalten ihre Elemente nach dem FIF0-Prinzip
(First-In-First-Out).
Operationen:
boolean isEmpty() : testet auf Leerheit;
int dequeue() : liefert erstes Element;
void enqueue(int x) : reiht x in die Schlange ein;
String toString() : liefert eine String-Darstellung.
Weiterhin müssen wir eine leere Schlange anlegen können.
429
![Page 31: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/31.jpg)
Modellierung:
() : booleanisEmpty+(x: int) : voidenqueue+() : intdequeue+
()Queue+
Queue
430
![Page 32: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/32.jpg)
Erste Idee:
• Realisiere Schlange mithilfe einer Liste :
1 2 3 4
first
last
• first zeigt auf das nächste zu entnehmende Element;
• last zeigt auf das Element, hinter dem eingefügt wird.
431
![Page 33: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/33.jpg)
Modellierung:
() : booleanisEmpty+(x: int) : voidenqueue+() : intdequeue+
()Queue+ nextinfo : int
List
+
Queuefirst, last
List+ (x: int)
−
+
Objekte der Klasse Queue enthalten zwei Verweise auf Objekte der
Klasse List.
432
![Page 34: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/34.jpg)
Implementierung:
public class Queue {
private List first, last;
// Konstruktor:
public Queue() {
first = last = null;
}
// Objekt-Methoden:
public boolean isEmpty() {
return List.isEmpty(first);
}
...
433
![Page 35: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/35.jpg)
public int dequeue() {
int result = first.info;
if (last == first) last = null;
first = first.next;
return result;
}
public void enqueue(int x) {
if (first == null) first = last = new List(x);
else { last.insert(x); last = last.next; }
}
public String toString() {
return List.toString(first);
}
} // end of class Queue
434
![Page 36: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/36.jpg)
• Die Implementierung ist wieder sehr einfach.
• ... nutzt ein paar mehr Features von List aus;
• ... die Listen-Elemente sind evt. über den gesamten Speicher
verstreut
==⇒ führt zu schlechtem ↑Cache-Verhalten des Programms
!
Zweite Idee:
• Realisiere die Schlange mithilfe eines Felds und zweier Pointer,
die auf das erste bzw. letzte Element der Schlange zeigen.
• Läuft das Feld über, ersetzen wir es durch ein größeres.
435
![Page 37: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/37.jpg)
• Die Implementierung ist wieder sehr einfach.
• ... nutzt ein paar mehr Features von List aus;
• ... die Listen-Elemente sind evt. über den gesamten Speicher
verstreut
==⇒ führt zu schlechtem ↑Cache-Verhalten des Programms
!
Zweite Idee:
• Realisiere die Schlange mithilfe eines Felds und zweier Pointer,
die auf das erste bzw. letzte Element der Schlange zeigen.
• Läuft das Feld über, ersetzen wir es durch ein größeres.
436
![Page 38: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/38.jpg)
first
last
a 1
q
x = q.dequeue();
x
437
![Page 39: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/39.jpg)
first
last
a
1
q
x
x = q.enqueue(5);
438
![Page 40: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/40.jpg)
first
last
a
1
5
q
x
439
![Page 41: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/41.jpg)
first
last
a
1
q
x
x = q.enqueue(5);
440
![Page 42: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/42.jpg)
first
last
5a
1
q
x
441
![Page 43: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/43.jpg)
Modellierung:
length+ : int
Arraylast : int−first : int−
Queue+
dequeue+enqueue+isEmpty+
()
() : int(x: int) : void() : boolean
a−
Queue
int
442
![Page 44: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/44.jpg)
Implementierung:
public class Queue {
private int first, last;
private int[] a;
// Konstruktor:
public Queue() {
first = last = -1;
a = new int[4];
}
// Objekt-Methoden:
public boolean isEmpty() { return first==-1; }
public String toString() {...}
...
443
![Page 45: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/45.jpg)
Implementierung von enqueue():
• Falls die Schlange leer war, muss first und last auf 0 gesetzt
werden.
• Andernfalls ist das Feld a genau dann voll, wenn das Element x
an der Stelle first eingetragen werden sollte.
• In diesem Fall legen wir ein Feld doppelter Größe an.
Die Elemente a[first], a[first+1],..., a[a.length-1],
a[0], a[1],..., a[first-1] kopieren wir nach b[0],...,
b[a.length-1].
• Dann setzen wir first = 0;, last = a.length und a = b;
• Nun kann x an der Stelle a[last] abgelegt werden.
444
![Page 46: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/46.jpg)
public void enqueue(int x) {
if (first==-1) {
first = last = 0;
} else {
int n = a.length;
last = (last+1)%n;
if (last == first) {
b = new int[2*n];
for (int i=0; i<n; ++i) {
b[i] = a[(first+i)%n];
} // end for
first = 0; last = n; a = b;
} }// end if and else
a[last] = x;
}
445
![Page 47: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/47.jpg)
Implementierung von dequeue():
• Falls nach Entfernen von a[first] die Schlange leer ist, werden
first und last auf -1 gesetzt.
• Andernfalls wird first um 1 (modulo der Länge von a)
inkrementiert.
• Für eine evt. Freigabe unterscheiden wir zwei Fälle.
• Ist first < last, liegen die Schlangen-Elemente an den Stellen
a[first],...,a[last].
Sind dies höchstens n/4, werden sie an die Stellen
b[0],...,b[last-first] kopiert.
446
![Page 48: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/48.jpg)
public int dequeue() {
int result = a[first];
if (last == first) {
first = last = -1;
return result;
}
int n = a.length;
first = (first+1)%n;
int diff = last-first;
if (diff>0 && diff<n/4) {
int[] b = new int[n/2];
for(int i=first; i<=last; ++i)
b[i-first] = a[i];
last = last-first;
first = 0; a = b;
} else ...
447
![Page 49: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/49.jpg)
• Ist last < first, liegen die Schlangen-Elemente an den Stellen
a[0],...,a[last] und a[first],...,a[a.length-1].
Sind dies höchstens n/4, werden sie an die Stellen
b[0],...,b[last] sowie b[first-n/2],...,b[n/2-1] kopiert.
• first und last müssen die richtigen neuen Werte erhalten.
• Dann kann a durch b ersetzt werden.
448
![Page 50: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/50.jpg)
if (diff<0 && diff+n<n/4) {
int[] b = new int[n/2];
for(int i=0; i<=last; ++i)
b[i] = a[i];
for(int i=first; i<n; i++)
b[i-n/2] = a[i];
first = first-n/2;
a = b;
}
return result;
}
449
![Page 51: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/51.jpg)
Zusammenfassung:
• Der Datentyp List ist nicht sehr abstract, dafür extrem flexibel
==⇒ gut geeignet für rapid prototyping.
• Für die nützlichen (eher) abstrakten Datentypen Stack und
Queue lieferten wir zwei Implementierungen:
Technik Vorteil Nachteil
List einfach nicht-lokal
int[] lokal etwas komplexer
• Achtung: oft werden bei diesen Datentypen noch weitere
Operationen zur Verfügung gestellt.
450
![Page 52: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/52.jpg)
• Die Implementierung ist wieder sehr einfach.
• ... nutzt ebenfalls kaum Features von List aus;
• ... die Listen-Elemente sind evt. über den gesamten Speicher
verstreut
==⇒ führt zu schlechtem ↑Cache-Verhalten des Programms.
Zweite Idee:
• Realisiere die Schlange mithilfe eines Felds und zweier Pointer,
die auf das erste bzw. letzte Element der Schlange zeigen.
• Läuft das Feld über, ersetzen wir es durch ein größeres.
451
![Page 53: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/53.jpg)
• Die Implementierung ist wieder sehr einfach.
• ... nutzt ebenfalls kaum Features von List aus;
• ... die Listen-Elemente sind evt. über den gesamten Speicher
verstreut
==⇒ führt zu schlechtem ↑Cache-Verhalten des Programms.
Zweite Idee:
• Realisiere die Schlange mithilfe eines Felds und zweier Pointer,
die auf das erste bzw. letzte Element der Schlange zeigen.
• Läuft das Feld über, ersetzen wir es durch ein größeres.
452
![Page 54: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/54.jpg)
first
last
a 1
q
x = q.dequeue();
x
453
![Page 55: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/55.jpg)
first
last
a
1
q
x
x = q.enqueue(5);
454
![Page 56: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/56.jpg)
first
last
a
1
5
q
x
455
![Page 57: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/57.jpg)
first
last
a
1
q
x
x = q.enqueue(5);
456
![Page 58: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/58.jpg)
first
last
5a
1
q
x
457
![Page 59: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/59.jpg)
Modellierung:
length+ : int
Arraylast : int−first : int−
Queue+
dequeue+enqueue+isEmpty+
()
() : int(x: int) : void() : boolean
a−
Queue
int
458
![Page 60: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/60.jpg)
Implementierung:
public class Queue {
private int first, last;
private int[] a;
// Konstruktor:
public Queue () {
first = last = -1;
a = new int[4];
}
// Objekt-Methoden:
public boolean isEmpty() { return first==-1; }
public String toString() {...}
...
459
![Page 61: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/61.jpg)
Implementierung von enqueue():
• Falls die Schlange leer war, muss first und last auf 0 gesetzt
werden.
• Andernfalls ist das Feld a genau dann voll, wenn das Element x
an der Stelle first eingetragen werden sollte.
• In diesem Fall legen wir ein Feld doppelter Größe an.
Die Elemente a[first], a[first+1],..., a[a.length-1],
a[0], a[1],..., a[first-1] kopieren wir nach b[0],...,
b[a.length-1].
• Dann setzen wir first = 0;, last = a.length und a = b;
• Nun kann x an der Stelle a[last] abgelegt werden.
460
![Page 62: 11.2 Keller (Stacks)seidl/Courses/SS2011/Info1/i11.pdf · 11.2 Keller (Stacks) Operationen: boolean isEmpty() : testet auf Leerheit; int pop() : liefert oberstes Element; void push(int](https://reader035.vdocuments.site/reader035/viewer/2022063018/5fdb4378d8c19d65ab41465f/html5/thumbnails/62.jpg)
public void enqueue (int x) {
if (first==-1) {
first = last = 0;
} else {
int n = a.length;
last = (last+1)%n;
if (last == first) {
int[] b = new int[2*n];
for (int i=0; i<n; ++i) {
b[i] = a[(first+i)%n];
} // end for
first = 0; last = n; a = b;
} }// end if and else
a[last] = x;
}
461