Heim >Backend-Entwicklung >PHP-Tutorial >PHP Master | Datenstrukturen für PHP -Entwickler: Stapel und Warteschlangen
<span><span><?php </span></span><span><span>class ReadingList </span></span><span><span>{ </span></span><span> <span>protected $stack; </span></span><span> <span>protected $limit; </span></span><span> </span><span> <span>public function __construct($limit = 10) { </span></span><span> <span>// initialize the stack </span></span><span> <span>$this->stack = array(); </span></span><span> <span>// stack can only contain this many items </span></span><span> <span>$this->limit = $limit; </span></span><span> <span>} </span></span><span> </span><span> <span>public function push($item) { </span></span><span> <span>// trap for stack overflow </span></span><span> <span>if (count($this->stack) < $this->limit) { </span></span><span> <span>// prepend item to the start of the array </span></span><span> <span>array_unshift($this->stack, $item); </span></span><span> <span>} else { </span></span><span> <span>throw new RunTimeException('Stack is full!'); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> </span><span> <span>public function pop() { </span></span><span> <span>if ($this->isEmpty()) { </span></span><span> <span>// trap for stack underflow </span></span><span> <span>throw new RunTimeException('Stack is empty!'); </span></span><span> <span>} else { </span></span><span> <span>// pop item from the start of the array </span></span><span> <span>return array_shift($this->stack); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> </span><span> <span>public function top() { </span></span><span> <span>return current($this->stack); </span></span><span> <span>} </span></span><span> </span><span> <span>public function isEmpty() { </span></span><span> <span>return empty($this->stack); </span></span><span> <span>} </span></span><span><span>}</span></span>In diesem Beispiel habe ich Array_unshift () und Array_Shift () anstelle von array_push () und array_pop () verwendet, damit das erste Element des Stapels immer das obere ist. Sie können Array_push () und array_pop () verwenden, um die semantische Konsistenz aufrechtzuerhalten. In diesem Fall wird das nte Element des Stapels zum Oberteil. Es macht keinen Unterschied, da der gesamte Zweck eines abstrakten Datentyps darin besteht, die Manipulation der Daten aus seiner tatsächlichen Implementierung abstrahieren. Fügen wir dem Stapel einige Artikel hinzu:
<span><span><?php </span></span><span><span>$myBooks = new ReadingList(); </span></span><span> </span><span><span>$myBooks->push('A Dream of Spring'); </span></span><span><span>$myBooks->push('The Winds of Winter'); </span></span><span><span>$myBooks->push('A Dance with Dragons'); </span></span><span><span>$myBooks->push('A Feast for Crows'); </span></span><span><span>$myBooks->push('A Storm of Swords'); </span></span><span><span>$myBooks->push('A Clash of Kings'); </span></span><span><span>$myBooks->push('A Game of Thrones');</span></span>Um einige Gegenstände aus dem Stapel zu entfernen:
<span><span><?php </span></span><span><span>echo $myBooks->pop(); // outputs 'A Game of Thrones' </span></span><span><span>echo $myBooks->pop(); // outputs 'A Clash of Kings' </span></span><span><span>echo $myBooks->pop(); // outputs 'A Storm of Swords'</span></span>Mal sehen, was oben auf dem Stapel steht:
<span><span><?php </span></span><span><span>echo $myBooks->top(); // outputs 'A Feast for Crows'</span></span>Was ist, wenn wir es entfernen?
<span><span><?php </span></span><span><span>echo $myBooks->pop(); // outputs 'A Feast for Crows'</span></span>Und wenn wir einen neuen Artikel hinzufügen?
<span><span><?php </span></span><span><span>$myBooks->push('The Armageddon Rag'); </span></span><span><span>echo $myBooks->pop(); // outputs 'The Armageddon Rag'</span></span>Sie können sehen, dass der Stack in erster Ausgabe funktioniert. Was auch immer zum Stapel zuletzt hinzugefügt wird, ist der erste, der entfernt wird. Wenn Sie weiterhin Pop -Artikel bis zum leeren Stapel popieren, erhalten Sie eine Ausnahme von Stapel -Unterlauflaufzeiten.
PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Stack is empty!' in /home/ignatius/Data Structures/code/array_stack.php:33 Stack trace: #0 /home/ignatius/Data Structures/code/example.php(31): ReadingList->pop() #1 /home/ignatius/Data Structures/code/array_stack.php(54): include('/home/ignatius/...') #2 {main} thrown in /home/ignatius/Data Structures/code/array_stack.php on line 33Oh, hallo ... PHP hat freundlicherweise eine Stapelverfolgung zur Verfügung gestellt, die den Programmausführungsstapel vor und bis zur Ausnahme zeigt!
<span><span><?php </span></span><span><span>class ReadingList extends SplStack </span></span><span><span>{ </span></span><span><span>}</span></span>Die Splstack -Klasse implementiert einige weitere Methoden als wir ursprünglich definiert haben. Dies liegt daran, dass Splstack als doppelt verknüpfte Liste implementiert wird, die die Fähigkeit zur Implementierung eines durchlaufbaren Stacks bietet. Eine verknüpfte Liste, ein weiterer abstrakter Datentyp selbst, ist eine lineare Sammlung von Objekten (Knoten), die zur Darstellung einer bestimmten Sequenz verwendet wird, wobei jeder Knoten in der Sammlung einen Zeiger auf den nächsten Knoten in der Sammlung beibehält. In seiner einfachsten Form sieht eine verknüpfte Liste ähnlich aus:
<span><span><?php </span></span><span><span>class ReadingList </span></span><span><span>{ </span></span><span> <span>protected $stack; </span></span><span> <span>protected $limit; </span></span><span> </span><span> <span>public function __construct($limit = 10) { </span></span><span> <span>// initialize the stack </span></span><span> <span>$this->stack = array(); </span></span><span> <span>// stack can only contain this many items </span></span><span> <span>$this->limit = $limit; </span></span><span> <span>} </span></span><span> </span><span> <span>public function push($item) { </span></span><span> <span>// trap for stack overflow </span></span><span> <span>if (count($this->stack) < $this->limit) { </span></span><span> <span>// prepend item to the start of the array </span></span><span> <span>array_unshift($this->stack, $item); </span></span><span> <span>} else { </span></span><span> <span>throw new RunTimeException('Stack is full!'); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> </span><span> <span>public function pop() { </span></span><span> <span>if ($this->isEmpty()) { </span></span><span> <span>// trap for stack underflow </span></span><span> <span>throw new RunTimeException('Stack is empty!'); </span></span><span> <span>} else { </span></span><span> <span>// pop item from the start of the array </span></span><span> <span>return array_shift($this->stack); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> </span><span> <span>public function top() { </span></span><span> <span>return current($this->stack); </span></span><span> <span>} </span></span><span> </span><span> <span>public function isEmpty() { </span></span><span> <span>return empty($this->stack); </span></span><span> <span>} </span></span><span><span>}</span></span>Um den Stapel in umgekehrter Reihenfolge zu durchqueren, setzen wir einfach den Iteratormodus auf FIFO (zuerst in, zuerst heraus):
<span><span><?php </span></span><span><span>$myBooks = new ReadingList(); </span></span><span> </span><span><span>$myBooks->push('A Dream of Spring'); </span></span><span><span>$myBooks->push('The Winds of Winter'); </span></span><span><span>$myBooks->push('A Dance with Dragons'); </span></span><span><span>$myBooks->push('A Feast for Crows'); </span></span><span><span>$myBooks->push('A Storm of Swords'); </span></span><span><span>$myBooks->push('A Clash of Kings'); </span></span><span><span>$myBooks->push('A Game of Thrones');</span></span>
<span><span><?php </span></span><span><span>class ReadingList </span></span><span><span>{ </span></span><span> <span>protected $stack; </span></span><span> <span>protected $limit; </span></span><span> </span><span> <span>public function __construct($limit = 10) { </span></span><span> <span>// initialize the stack </span></span><span> <span>$this->stack = array(); </span></span><span> <span>// stack can only contain this many items </span></span><span> <span>$this->limit = $limit; </span></span><span> <span>} </span></span><span> </span><span> <span>public function push($item) { </span></span><span> <span>// trap for stack overflow </span></span><span> <span>if (count($this->stack) < $this->limit) { </span></span><span> <span>// prepend item to the start of the array </span></span><span> <span>array_unshift($this->stack, $item); </span></span><span> <span>} else { </span></span><span> <span>throw new RunTimeException('Stack is full!'); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> </span><span> <span>public function pop() { </span></span><span> <span>if ($this->isEmpty()) { </span></span><span> <span>// trap for stack underflow </span></span><span> <span>throw new RunTimeException('Stack is empty!'); </span></span><span> <span>} else { </span></span><span> <span>// pop item from the start of the array </span></span><span> <span>return array_shift($this->stack); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> </span><span> <span>public function top() { </span></span><span> <span>return current($this->stack); </span></span><span> <span>} </span></span><span> </span><span> <span>public function isEmpty() { </span></span><span> <span>return empty($this->stack); </span></span><span> <span>} </span></span><span><span>}</span></span>SpldoublyLinkedList Implementiert auch die ArrayAccess -Schnittstelle, sodass Sie als Array -Elemente auch Elemente sowohl zu Splqueue als auch zu Splstack hinzufügen können:
<span><span><?php </span></span><span><span>$myBooks = new ReadingList(); </span></span><span> </span><span><span>$myBooks->push('A Dream of Spring'); </span></span><span><span>$myBooks->push('The Winds of Winter'); </span></span><span><span>$myBooks->push('A Dance with Dragons'); </span></span><span><span>$myBooks->push('A Feast for Crows'); </span></span><span><span>$myBooks->push('A Storm of Swords'); </span></span><span><span>$myBooks->push('A Clash of Kings'); </span></span><span><span>$myBooks->push('A Game of Thrones');</span></span>Gegenstände von der Vorderseite der Warteschlange zu entfernen:
<span><span><?php </span></span><span><span>echo $myBooks->pop(); // outputs 'A Game of Thrones' </span></span><span><span>echo $myBooks->pop(); // outputs 'A Clash of Kings' </span></span><span><span>echo $myBooks->pop(); // outputs 'A Storm of Swords'</span></span>enqueue () ist ein Alias für Push (), aber beachten Sie, dass dequeue () kein Alias für Pop () ist; pop () hat eine andere Bedeutung und Funktion im Kontext einer Warteschlange. Wenn wir hier Pop () verwendet hätten, würde es das Element am Ende (Schwanz) der Warteschlange entfernen, die gegen die FIFO -Regel verstößt. In ähnlicher Weise müssen wir BOWS () anstelle von Top () verwenden, um zu sehen, was vorne (Kopf) der Warteschlange steht:
<span><span><?php </span></span><span><span>echo $myBooks->top(); // outputs 'A Feast for Crows'</span></span>
PHP unterstützt verschiedene Arten von Datenstrukturen, einschließlich Arrays, Objekten und Ressourcen. Arrays sind die häufigsten und vielseitigsten Datenstrukturen in PHP. Sie können alle Arten von Daten enthalten, einschließlich anderer Arrays, und können indiziert oder assoziativ werden. Objekte in PHP sind Instanzen von Klassen, die Eigenschaften und Methoden haben können. Ressourcen sind spezielle Variablen, die Verweise auf externe Ressourcen enthalten, z. B. Datenbankverbindungen.
Wie kann ich eine Warteschlange in PHP implementieren. Das FIFO -Prinzip (zuerst in, zuerst). In PHP können Sie die Splqueue -Klasse verwenden, um eine Warteschlange zu implementieren. Sie können Elemente mit der Enqueue () -Methode auf die Warteschlange und Dequeue -Elemente aus der Warteschlange mit der Methode dequeue (). 🎜> Ein Stapel und eine Warteschlange sind beide Arten von Datenstrukturen, haben jedoch einen wesentlichen Unterschied in der Hinzufügung und Entfernung von Elementen. Ein Stapel folgt dem LIFO -Prinzip (zuletzt, zuerst), was bedeutet, dass das letzte hinzugefügte Element das erste ist, das entfernt wird. Andererseits folgt eine Warteschlange dem FIFO -Prinzip (zuerst in, zuerst), was bedeutet, dass das erste hinzugefügte Element das erste ist, das entfernt wird.
Das obige ist der detaillierte Inhalt vonPHP Master | Datenstrukturen für PHP -Entwickler: Stapel und Warteschlangen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!