| Die Theorie der Daten-Speicher unterscheidet die beiden Typen "Stapel" (stack, first in - last out) und "Warteschlange" (queue, first in - first out) | Alle modernen Programmiersprachen bieten die Möglichkeit, solche Speicher mit Array-Funktionen zu realisieren. |
PHP
|
PHP Hypertext Processor, PHP-Arrays |
| Datenspeicher | Verwendung von Arrays als Stapel oder Warteschlangen |
| Stapel | Stack-Speicher: first in - last out |
| Warteschlange | Queue-Speicher: first in - first out (FIFO) |
| Schieberegister | Warteschlange fixer Länge (Förderband) |
| Sonderfall | Funktion array_unshift() |
| Verwandte Themen | Array @ Datenspeicher in Javascript, Perl |
Arrays als Datenspeicher |
|
Stapel ↓ (Stack)Ein Stapel-Speicher wird aus Elementen aufgeschichtet. Man kann immer nur das zuletzt aufgeschichtete Element herunternehmen, das erste (unterste) Element kann als letztes wieder entnommen werden. Ein Stack arbeitet nach dem Prinzip 'first in - last out' und umgekehrt.● Ein bekanntes Beispiel ist das Spiel Turm von Hanoi: Dabei werden Scheiben zwischen 3 verschiedenen Stapeln umgeschichtet. |
Ein Array dient als Stapel-Speicher. Die Funktion array_push() dient zum Aufschichten eines Elements, die Funktion array_pop() zum Herunternehmen. • Ein typisches Merkmal ist die ständig wechselnde Länge des Arrays (Höhe des Stapels) |
Warteschlange ↓ (Queue)Eine Warteschlange (Förderband, Queue, Shift Register) gibt die darauf enthaltenen Elemente in der gleichen Reihenfolge zurück, in welcher sie gespeichert wurden. Es arbeitet nach dem Prinzip 'first in - first out'.● Ein bekanntes Beispiel ist eine Haltestelle: Die ankommenden Fahrgäste stellen sich an und bilden eine anwachsende Reihe. Wenn ein Bus kommt, dann steigen die Passagiere in der gleichen Reihenfolge ihres Eintreffens ein - zumindest in der Theorie... |
Ein Array dient als Warteschlangen-Speicher. Die Funktion array_push()
dient zum Anreihen eines Elements, die Funktion array_shift() zum
Entfernen. • Typisches Merkmal: Die Änderung der Länge (Zunahme, Abnahme) erfolgt durch unterschiedliche, voneinander unabhängige Prozesse. |
Schieberegister (Shift Register)Ein Sonderfall ist eine Warteschlange fixer Länge (↓ Schieberegister).● Anschauliches Beispiel Förderband: Mit jedem Schritt wird gleich viel Fördergut auf- und abgeladen. Jedes Fördergut braucht gleich lang, um das Förderband zu passieren. |
Mit jedem Arbeitsschritt wird genau 1 Array-Element am Ende angefügt
(array_push() ) und 1 Element am Anfang entnommen
(array_shift() ). • Jedes Element braucht gleich viele Schritte, um das gesamte Array (Schieberegister, Förderband) zu durchlaufen. |
| ♣ Tipp: Verwenden sie für die hier vorgestellten Funktionen nach Möglichkeit nur numerische Schlüssel: Ganze Zahlen, beginnend mit 0 ! | Die Funktionen arbeiten zwar auch mit String-Schlüsseln, die Verwaltung ist in diesem Fall jedoch wesentlich komplizierter und gegen Fehler anfällig. |
Arrays als Warteschlange (Queue, FIFO) |
|
| Neue Elemente werden immer am Ende des Arrays angereiht. Die Entnahme von Elemente erfolgt stets vom Anfang des Arrays. | Die Elemente verlassen den Speicher in der Reihenfolge ihrer Eingabe (First in, first out - FIFO). |
Aufbau einer Warteschlange• Zum Aufbau ('Anstellen') verwendet man mit array_push() die gleiche Funktion wie für einen Stapel.• Alternativ kann man neue Array-Elemente ohne Angabe des Schlüssels zuweisen. |
$qa = array();
Ausgabe:
$c = array_push($qa,'x','y'); $qa[] = 'z'; print_r($qa); Array([0]=>x [1]=>y [2]=>z) |
Abbau einer Warteschlange• Mit Funktion array_shift() wird jeweils das erste Element entnommen und die Warteschlange um 1 Element kleiner.• Das entnommene Element ist jeweils das zuerst angefügte. • Die Elemente werden beim Abbau in der gleichen Reihenfolge wie beim Aufbau zurückgewonnen. • Die arithmetischen Schlüssel der restlichen Array-Elemente werden neu nummeriert ! String-Schlüssel bleiben unverändert. • Wenn die Warteschlange leer ist, dann gibt die Funktion array_shift() den Wert NULL zurück. • Die aktuelle Länge der Warteschlange kann man bei Bedarf mit Funktion count() ermitteln (gibt die Anzahl der Array-Elemente zurück). |
$v = array_shift($qa);
ergibt $v='x' und die Ausgabe
print_r($qa); Array([0]=>y [1]=>z)
Weiterer Abbau ergibt
$v = array_shift(); // 'y'
$v = array_shift(); // 'z' $v = array_shift(); // 'NULL |
| Ein häufig verwendeter Spezialfall ist ein ↓ Schieberegister (Warteschlange fixer Länge) | |
Schieberegister (Warteschlange fixer Länge) |
|
|
Ein Schieberegister ist ein
Warteschlangen-Speicher ↑ (Queue) fixer Länge: Die einzelnen Elemente
verlassen den Speicher in der gleichen Reihenfolge wie bei ihrer Eingabe. • Ein Förderband ist ein anschauliches Modell für ein Schieberegister. |
In jedem Arbeits-Schritt wird genau 1 Element aufgeladen und 1 Element abgeladen. Jedes Element braucht daher zum Durchlaufen des Speichers die gleiche vorgegebene Anzahl von Schritten. |
ErzeugungDie Länge eines Schieberegisters (Anzahl der Array-Elemente) wird vorgegeben und während seiner Verwendung nicht geändert. Daher wird vor Beginn der Arbeit ein leeres Register der gewünschten Länge erzeugt.• Funktion array_fill() erzeugt ein Array mit mehreren Elementen von gleichen Werten: Das 1.Argument bestimmt den ersten (numerischen) Schlüssel (normalerweise 0), das 2.Argument die Anzahl der Elemente, das 3.Argument den Wert der erzeugten Elemente. |
Erzeugung eines leeren Förderbandes: // 3 leere Elemente:
$qa = array(NULL,NULL,NULL);// 100 leere Elemente:
$qa = array_fill(0,100,NULL);
|
|
Arbeitsschritt Beim Weiterrücken eines Förderbandes wird in jedem Schritt ein neues Element (hier $qin ) angefügt und ein Element (hier $qout ) entnommen. Die Länge des Förderband-Arrays bleibt dabei stets konstant. Man kann mit dem Wert NULL auch leere Elemente anfügen bzw. mit Funktion is_null() prüfen, ob der Wert einer Variablen NULL ist. |
Weiter-Rücken eines Förderbandes:
$qin = 'neu';
array_push($qa,$qin); $qout = array_shift($qa); print "qin=$qin, qout=$qout <br />\n"; |
LeerenZum Leeren eines Förderbandes fügt man so viele beliebige oder NULL-Elemente an, wie das Förderband lang ist. Dadurch werden alle noch enthaltenen Elemente abgeladen. |
Leeren eines Förderbandes:
for($i=0;$i<count($qa);$i++) {
array_push($qa,NULL);
}
$qout = array_shift($qa); |
|