큐: FIFO(선입선출) 규칙을 충족합니다.
다음은 PHP를 사용하여 간단한 순환 큐 모델을 구현합니다.
큐의 초기 상태에서 큐 길이는 0이고 포인터는 다음과 같습니다. 대기열의 헤드와 테일은 동일합니다.
큐 작업 시작: 대기열 테일 포인터가 뒤로 이동하고 길이가 1 증가합니다.
큐 제거 작업; 포인터가 뒤로 이동하면 길이가 1만큼 감소합니다.
원형 대기열의 특징: 대기열 크기는 고정되고 대기열 길이는 1만큼 줄어듭니다. 열린 메모리 공간을 재활용할 수 있으며 포인터의 이동은 기반입니다.
다음 예제에서는 배열을 사용하여 대기열 저장을 구현하고 배열 첨자를 포인터로 사용합니다.
<?php /** * Class Queue */ class Queue { /** * @var int 队头指针 */ private $_front; /** * @var int 队尾指针 */ private $_rear; /** * @var array 队列数组 */ private $_queue; /** * @var int 队列实际长度 */ private $_queueLength; /** * @var int 队列容量; */ private $_queueSize; /** * Queue constructor.初始化队列 * @param int $capacity 容量(循环队列的最大长度) */ public function __construct($size) { $this->_queue = []; $this->_queueSize = $size; $this->_front = 0; $this->_rear = 0; $this->_queueLength = 0; } /** * 销毁队列; */ public function __destruct() { unset($this->_queue); } /** * @method 入队 * @param mixed $elem 入队的元素 * @return bool */ public function enQueue($elem) { if (!$this->isFull()) { $this->_queue[$this->_rear] = $elem; $this->_rear++; $this->_rear = $this->_rear % $this->_queueCapacity; $this->_queueLength++; return true; } return false; } /** * @method 出队 * @return mixed|null */ public function deQueue() { if (!$this->isEmpty()) { $elem = $this->_queue[$this->_front]; //unset($this->_queue[$this->_front]); $this->_front++; $this->_front %= $this->_queueCapacity; $this->_queueLength--; return $elem; } return null; } /** * @method 判断队列是否为空; * @return bool */ public function isEmpty() { return $this->_queueLength === 0; } /** * @method 判断队列是否饱和; * @return bool */ public function isFull() { return $this->_queueLength === $this->_queueCapacity; } /** * @method 遍历队列并输出(测试队列) */ public function outputQueue() { for ($i = $this->_front; $i < $this->_queueLength + $this->_front; $i++) { echo $this->_queue[$i % $this->_queueCapacity].PHP_EOL; } } /** * @method 清空队列 */ public function clearQueue() { $this->_queue = []; $this->_front = 0; $this->_rear = 0; $this->_queueLength = 0; } }
대기열 클래스 테스트는 솔직히 별거 아닙니다. 실제 비즈니스 시나리오에 따라 다릅니다.
$a = new Queue(3); echo 'enQueue1 $a->enQueue(1)'.PHP_EOL; $a->enQueue(1); echo 'enQueue2 $a->enQueue(2)'.PHP_EOL; $a->enQueue(2); echo 'enQueue3 $a->enQueue(3)'.PHP_EOL; $a->enQueue(3); echo 'enQueue4 $a->enQueue(4)'.PHP_EOL; $a->enQueue(4); //讲道理是失败的; $a->outputQueue(); //输出 1 2 3 echo PHP_EOL; echo PHP_EOL; echo $a->deQueue(); //输出 1 队列 2 3 echo PHP_EOL; echo PHP_EOL; echo $a->deQueue(); //输出 2 队列 3 $a->enQueue(5); //队列 3 5 echo PHP_EOL; echo PHP_EOL; $a->outputQueue(); //输出 3 5 $a->clearQueue(); //队列空;
뭔가 잘못된 경우 조언해 주세요
위 내용은 대기열을 구현하기 위한 PHP 데이터 구조의 샘플 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!