Maison >développement back-end >tutoriel php >PHP Master | Structures de données pour les développeurs PHP: piles et files d'attente
<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>Dans cet exemple, j'ai utilisé array_unshift () et array_shift (), plutôt que array_push () et array_pop (), de sorte que le premier élément de la pile est toujours le haut. Vous pouvez utiliser array_push () et array_pop () pour maintenir la cohérence sémantique, auquel cas, le nième élément de la pile devient le sommet. Cela ne fait aucune différence dans les deux sens, car le but d'un type de données abstrait est de résumer la manipulation des données de sa mise en œuvre réelle. Ajoutons quelques éléments à la pile:
<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>Pour supprimer certains éléments de la pile:
<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>Voyons ce qui se passe en haut de la pile:
<span><span><?php </span></span><span><span>echo $myBooks->top(); // outputs 'A Feast for Crows'</span></span>Et si nous le supprimons?
<span><span><?php </span></span><span><span>echo $myBooks->pop(); // outputs 'A Feast for Crows'</span></span>Et si nous ajoutons un nouvel élément?
<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>Vous pouvez voir que la pile fonctionne sur une dernière base. Tout ce qui est ajouté à la pile est le premier à être supprimé. Si vous continuez à faire preuve d'objets jusqu'à ce que la pile soit vide, vous obtiendrez une exception d'exécution de sous-flux de pile.
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, bonjour… PHP a aimablement fourni une trace de pile montrant la pile d'appels d'exécution du programme avant et jusqu'à l'exception!
<span><span><?php </span></span><span><span>class ReadingList extends SplStack </span></span><span><span>{ </span></span><span><span>}</span></span>La classe SPLSTACK met en œuvre quelques méthodes supplémentaires que nous n'avons définies à l'origine. En effet, SplStack est implémenté en tant que liste liée à une liaison double, qui offre la capacité d'implémenter une pile traversable. Une liste liée, qui est un autre type de données abstrait lui-même, est une collection linéaire d'objets (nœuds) utilisée pour représenter une séquence particulière, où chaque nœud de la collection maintient un pointeur vers le nœud suivant de la collection. Dans sa forme la plus simple, une liste liée ressemble à ceci:
<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>Pour traverser la pile dans l'ordre inverse, nous définissons simplement le mode itérateur sur FIFO (premier dans, premier sorti):
<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>Liste de listes spldoubly implémente également l'interface ARRAYACCESS afin que vous puissiez également ajouter des éléments à Splqueue et Splstack comme éléments de tableau:
<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>Pour supprimer les éléments de l'avant de la file d'attente:
<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 () est un alias pour push (), mais notez que dequeue () n'est pas un alias pour pop (); pop () a une signification et une fonction différentes dans le contexte d'une file d'attente. Si nous avions utilisé POP () ici, il supprimerait l'élément de la fin (queue) de la file d'attente qui viole la règle FIFO. De même, pour voir ce qui est à l'avant (tête) de la file d'attente, nous devons utiliser le bas () au lieu de TOP ():
<span><span><?php </span></span><span><span>echo $myBooks->top(); // outputs 'A Feast for Crows'</span></span>
PHP prend en charge plusieurs types de structures de données, y compris des tableaux, des objets et des ressources. Les tableaux sont les structures de données les plus courantes et polyvalentes en PHP. Ils peuvent contenir tout type de données, y compris d'autres tableaux, et peuvent être indexés ou associatifs. Les objets en PHP sont des cas de classes, qui peuvent avoir des propriétés et des méthodes. Les ressources sont des variables spéciales qui détiennent des références aux ressources externes, telles que les connexions de base de données.
Une pile est un type de structure de données qui suit le LIFO ( Principe du dernier dans, premier sorti). Dans PHP, vous pouvez utiliser la classe SplStack pour implémenter une pile. Vous pouvez pousser des éléments sur la pile à l'aide de la méthode push () et des éléments POP de la pile à l'aide de la méthode pop ().
Les tableaux et les objets en PHP sont les deux types de structures de données, mais ils ont des différences clés. Les tableaux sont des listes simples de valeurs, tandis que les objets sont des instances de classes et peuvent avoir des propriétés et des méthodes. Les tableaux peuvent être indexés ou associatifs, tandis que les objets utilisent toujours des touches de chaîne. Les tableaux sont plus polyvalents et plus faciles à utiliser, tandis que les objets fournissent plus de structure et d'encapsulation.
L'utilisation de la bonne structure de données peut améliorer considérablement les performances de votre code PHP. Par exemple, si vous devez stocker un grand nombre d'éléments et rechercher fréquemment des éléments spécifiques, l'utilisation d'une table de hachage ou d'un ensemble peut être beaucoup plus rapide que d'utiliser un tableau. De même, si vous avez besoin d'ajouter et de supprimer fréquemment des éléments aux deux extrémités, l'utilisation d'un désactive peut être plus efficace que d'utiliser un tableau.
La classe SpldoublyLinkedLedList Dans PHP est une structure de données qui implémente une liste doublement liée. Il vous permet d'ajouter, de supprimer et d'accès aux éléments aux deux extrémités de la liste en temps constant. Il fournit également des méthodes d'itération sur les éléments de la liste et pour tri les éléments.
Une file d'attente est un type de structure de données qui suit Le principe FIFO (premier dans, premier sorti). Dans PHP, vous pouvez utiliser la classe Splqueue pour implémenter une file d'attente. Vous pouvez enterrer des éléments sur la file d'attente à l'aide de la méthode ENQUEUe () et les éléments de désactivation de la file d'attente à l'aide de la méthode Dequeue ().
Une pile et une file d'attente sont les deux types de structures de données, mais elles ont une différence clé dans la façon dont les éléments sont ajoutés et supprimés. Une pile suit le principe LIFO (dernier dans, premier sorti), ce qui signifie que le dernier élément ajouté est le premier à être supprimé. Une file d'attente, en revanche, suit le principe FIFO (premier dans, premier sorti), ce qui signifie que le premier élément ajouté est le premier à être supprimé.
La classe SPLHEAP en PHP est une structure de données qui implémente un tas. Un tas est un type d'arbre binaire où chaque nœud parent est inférieur ou égal à ses nœuds enfants. Vous pouvez utiliser la classe SPLHEAP pour créer un mine-heap ou un max-heap, et pour ajouter, supprimer et accéder aux éléments dans le tas.
L'utilisation de structures de données en PHP peut fournir plusieurs avantages. Ils peuvent vous aider à organiser vos données d'une manière plus efficace et logique, ce qui peut rendre votre code plus facile à comprendre et à maintenir. Ils peuvent également améliorer les performances de votre code, en particulier lorsqu'ils traitent de grandes quantités de données ou d'opérations complexes.
Un arbre binaire est un type de la structure des données où chaque nœud a au plus deux enfants, appelés l'enfant gauche et l'enfant droit. Dans PHP, vous pouvez implémenter un arbre binaire en utilisant une classe qui a des propriétés pour la valeur du nœud et des enfants gauche et droit. Vous pouvez ensuite utiliser des méthodes pour ajouter, supprimer et rechercher des nœuds dans l'arborescence.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!