1.3 Stakke og køer


Mange grundlæggende datatyper repræsenterer samlinger af objekter. Nærmere betegnet består datatypens værdimængde af samlinger af objekter, mens operationerne tilføjer, fjerner og undersøger objekter i samlingen. I dette afsnit betragter vi tre sådanne typer: sækken, køen og stakken. De tre typer tillader alle, at objekter tilføjes til samlingen, men adskiller sig i, om og i hvilken rækkefølge samlingens objekter kan undersøges eller fjernes.

APG for sæk, kø og stak.

Vi definerer funktionaliteten af abstrakte datatyper ved at specificere en anvendlsesprogrammeringsgrænseflade (APG), som fastægger, hvordan en klient anvender datatypen. Disse samlingsdatatyperne illustrerer desuden to kendetegn ved java: Generiske typer og gennemløb.
public class Bag<Item> implements Iterable<Item>
Bag() en tom sæk
voidadd(Item item)tilføj et element
booleanisEmpty()er sækken tom?
intsize()antal elementer i sækken
public class Queue<Item> implements Iterable<Item>
Queue() en tom kø
voidenqueue(Item item)tilføj et element «sidst» i køen
Itemdequeue()afkø et element, dvs. fjern køens «første» (eller «ældste») element
booleanisEmpty()er køen tom?
intsize()antal elementer i køen
public class Stack<Item> implements Iterable<Item>
Stack() sen tom stak
voidpush(Item item)stak et element, dvs. læg det «øverst» på stakken
Itempop()afstak et element, dvs. fjern stakkens «øverste» (eller «yngste») element
booleanisEmpty()er stakken tom?
intsize()antal elementer i stakken

Samlinger implementeret med rækker og dynamiske rækker.

Hægtede lister.

En hægtet liste er en rekursiv datastruktur, som enten er tom (nullisten) eller henviser til en knude, der indedholder et generisk element og en henvisning til en hægtet liste. For at implementere hægtede lister begynder vi med at definere knudeabstraktionen i en indre privatklasse:
private class Node {
   Item item;
   Node next;
}

Samlinger implementeret med hægtede lister.

Gennemløb.

For at forstå, hvordan man gennemløber en hægtet liste, betragter vi først en stump klientkode, der udskriver alle elementer i en samling strenge på hver sin linje.
Stack<String> collection = new Stack<String>();
...
for (String s : collection)
   StdOut.println(s);
...
Denne for-hver-konstruktion er bare en forkortelse for følgende while-sætning:
Iterator<String> i = collection.iterator();
while (i.hasNext()) { 
   String s = i.next();
   StdOut.println(s);
}
Følgende skridt er nødvendige for at implementere gennemløb i en samling: