641. Conception Circulaire Deque
Difficulté :Moyen
Sujets : Tableau, liste chaînée, conception, file d'attente
Concevez votre implémentation de la file d'attente circulaire à double extrémité (deque).
Implémentez la classe MyCircularDeque :
Exemple 1 :
["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"] [[3], [1], [2], [3], [4], [], [], [], [4], []]
[null, true, true, true, false, 2, true, true, true, 4]
MyCircularDeque myCircularDeque = new MyCircularDeque(3); myCircularDeque.insertLast(1); // return True myCircularDeque.insertLast(2); // return True myCircularDeque.insertFront(3); // return True myCircularDeque.insertFront(4); // return False, the queue is full. myCircularDeque.getRear(); // return 2 myCircularDeque.isFull(); // return True myCircularDeque.deleteLast(); // return True myCircularDeque.insertFront(4); // return True myCircularDeque.getFront(); // return 4
Contraintes :
Solution :
Nous pouvons utiliser un tableau pour représenter la structure deque. Nous conserverons un pointeur de tête et de queue qui nous aidera à suivre l'avant et l'arrière du deque, en l'enroulant si nécessaire pour obtenir le comportement circulaire.
Implémentons cette solution en PHP : 641. Conception Circulaire Deque
Voici une solution étape par étape pour la classe MyCircularDeque :
<?php class MyCircularDeque { /** * @var array */ private $deque; /** * @var int */ private $maxSize; /** * @var int */ private $front; /** * @var int */ private $rear; /** * @var int */ private $size; /** * Initialize your data structure here. Set the size of the deque to be k. * * @param Integer $k */ function __construct($k) { ... ... ... /** * go to ./solution.php */ } /** * Adds an item at the front of Deque. Return true if the operation is successful. * * @param Integer $value * @return Boolean */ function insertFront($value) { ... ... ... /** * go to ./solution.php */ } /** * Adds an item at the rear of Deque. Return true if the operation is successful. * * @param Integer $value * @return Boolean */ function insertLast($value) { ... ... ... /** * go to ./solution.php */ } /** * Deletes an item from the front of Deque. Return true if the operation is successful. * * @return Boolean */ function deleteFront() { ... ... ... /** * go to ./solution.php */ } /** * Deletes an item from the rear of Deque. Return true if the operation is successful. * * @return Boolean */ function deleteLast() { ... ... ... /** * go to ./solution.php */ } /** * Get the front item from the deque. If the deque is empty, return -1. * * @return Integer */ function getFront() { ... ... ... /** * go to ./solution.php */ } /** * Get the last item from the deque. If the deque is empty, return -1. * * @return Integer */ function getRear() { ... ... ... /** * go to ./solution.php */ } /** * Checks whether the deque is empty or not. * * @return Boolean */ function isEmpty() { ... ... ... /** * go to ./solution.php */ } /** * Checks whether the deque is full or not. * * @return Boolean */ function isFull() { ... ... ... /** * go to ./solution.php */ } } /** * Your MyCircularDeque object will be instantiated and called as such: * $obj = MyCircularDeque($k); * $ret_1 = $obj->insertFront($value); * $ret_2 = $obj->insertLast($value); * $ret_3 = $obj->deleteFront(); * $ret_4 = $obj->deleteLast(); * $ret_5 = $obj->getFront(); * $ret_6 = $obj->getRear(); * $ret_7 = $obj->isEmpty(); * $ret_8 = $obj->isFull(); */ ?> <h3> Explication: </h3> <ol> <li> <p><strong>Initialisation</strong> :</p> <ul> <li>Nous initialisons le deque en utilisant un tableau de taille k et définissons initialement toutes les valeurs sur -1.</li> <li>Les pointeurs avant et arrière sont initialisés à 0.</li> <li> size garde une trace du nombre actuel d'éléments dans le deque.</li> </ul> </li> <li> <p><strong>insertFront($value)</strong> :</p> <ul> <li>Vérifiez si le deque est plein en utilisant isFull().</li> <li>Sinon, décrémentez le pointeur avant (avec enroulement circulaire en utilisant modulo).</li> <li>Placez la valeur au nouveau devant et incrémentez la taille.</li> </ul> </li> <li> <p><strong>insertLast($value)</strong> :</p> <ul> <li>Vérifiez si le deque est plein.</li> <li>Sinon, placez la valeur à l'arrière et déplacez le pointeur arrière vers l'avant (en utilisant encore une fois modulo pour le bouclage).</li> <li>Incrémentez la taille.</li> </ul> </li> <li> <p><strong>deleteFront()</strong> :</p> <ul> <li>Vérifiez si le deque est vide en utilisant isEmpty().</li> <li>Sinon, incrémentez le pointeur avant (enveloppement circulaire) et décrémentez la taille.</li> </ul> </li> <li> <p><strong>deleteLast()</strong> :</p> <ul> <li>Vérifiez si le deque est vide.</li> <li>Sinon, décrémentez le pointeur arrière et réduisez la taille.</li> </ul> </li> <li> <p><strong>getFront()</strong> :</p> <ul> <li>Si le deque est vide, renvoie -1.</li> <li>Sinon, renvoyez l'élément au pointeur avant.</li> </ul> </li> <li> <p><strong>getRear()</strong> :</p> <ul> <li>Si le deque est vide, renvoie -1.</li> <li>Sinon, renvoyez l'élément avant le pointeur arrière actuel (puisque l'arrière pointe vers la prochaine position disponible).</li> </ul> </li> <li> <p><strong>isEmpty()</strong> :</p> <ul> <li>Renvoie vrai si le deque est vide (la taille est 0).</li> </ul> </li> <li> <p><strong>isFull()</strong> :</p> <ul> <li>Renvoie vrai si le deque est plein (la taille est égale à maxSize).</li> </ul> </li> </ol> <h3> Exemple de procédure pas à pas </h3> <pre class="brush:php;toolbar:false">$myCircularDeque = new MyCircularDeque(3); // Initialize deque with size 3 $myCircularDeque->insertLast(1); // return true $myCircularDeque->insertLast(2); // return true $myCircularDeque->insertFront(3); // return true $myCircularDeque->insertFront(4); // return false, deque is full echo $myCircularDeque->getRear(); // return 2 echo $myCircularDeque->isFull(); // return true $myCircularDeque->deleteLast(); // return true $myCircularDeque->insertFront(4); // return true echo $myCircularDeque->getFront(); // return 4
Liens de contact
Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !
Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :
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!