The queue is a special linear table. It only allows deletion operations at the front end of the table, which can be called front; while at the back end of the table, you can Call it rear to perform the insertion operation. (Recommended learning: PHP video tutorial)
The queue is the same as the stack, it is a linear table with restricted operations. The difference from the stack is that the queue follows the "advanced First out" principle, while the stack follows the "first in, last out" principle. The end of the queue where the insertion operation is performed is called the tail of the queue, and the end where the deletion operation is performed is called the head of the queue. Insertion operations are only allowed at the end of the queue, and deletion operations are allowed at the head of the queue.
The data elements of the queue are also called queue elements. Inserting an element at the end of the queue is called enqueuing, and deleting an element at the head of the queue is called dequeuing. Specific implementation reference code:
<?php /** * php队列算法 * * Create On 2010-6-4 * Author Been * QQ:281443751 * Email:binbin1129@126.com **/ class data { //数据 private $data; public function __construct($data){ $this->data=$data; echo $data.":哥进队了!<br>"; } public function getData(){ return $this->data; } public function __destruct(){ echo $this->data.":哥走了!<br>"; } } class queue{ protected $front;//队头 protected $rear;//队尾 protected $queue=array('0'=>'队尾');//存储队列 protected $maxsize;//最大数 public function __construct($size){ $this->initQ($size); } //初始化队列 private function initQ($size){ $this->front=0; $this->rear=0; $this->maxsize=$size; } //判断队空 public function QIsEmpty(){ return $this->front==$this->rear; } //判断队满 public function QIsFull(){ return ($this->front-$this->rear)==$this->maxsize; } //获取队首数据 public function getFrontDate(){ return $this->queue[$this->front]->getData(); } //入队 public function InQ($data){ if($this->QIsFull())echo $data.":我一来咋就满了!(队满不能入队,请等待!)<br>"; else { $this->front++; for($i=$this->front;$i>$this->rear;$i--){ //echo $data; if($this->queue[$i])unset($this->queue[$i]); $this->queue[$i]=$this->queue[$i-1]; } $this->queue[$this->rear+1]=new data($data); //print_r($this->queue); //echo $this->front; echo '入队成功!<br>'; } } //出队 public function OutQ(){ if($this->QIsEmpty())echo "队空不能出队!<br>"; else{ unset($this->queue[$this->front]); $this->front--; //print_r($this->queue); //echo $this->front; echo "出队成功!<br>"; } } } $q=new queue(3); $q->InQ("小苗"); $q->InQ('马帅'); $q->InQ('溜冰'); $q->InQ('张世佳'); $q->OutQ(); $q->InQ("周瑞晓"); $q->OutQ(); $q->OutQ(); $q->OutQ(); $q->OutQ();
There are two classes in this case:
The first is the data class, which is used to store data and enter queue elements. Queue and dequeuing situations;
The second one is the queue class, which is used for some enqueuing and dequeuing operations of queue elements.
The queue contains four attributes:
front (the head of the queue)
rear (the tail of the queue)
maxsize (the length of the queue, that is, the number of queue elements)
queue (an object that stores all queue elements that have been queued)
1. When initializing the queue, generate a queue and pass in a parameter As the maxsize initialization queue, set the rear of the queue to 0 and the front of the queue to 0. At this time, there is only element 0 in the queue, and both rear and front point to it.
2. When joining the queue, you first need to determine whether the queue is full (front-rear == maxsize). If it is full, insertion is not allowed. If it is not full, insertion is allowed. When inserting, front is incremented, and then all elements of the queue are moved forward by one position (leaving the tail position of the queue to insert new elements), and then a new data object is generated and inserted into the tail position of the queue.
3. When dequeuing, determine whether the queue is empty (front == rear). If it is empty, it cannot be dequeued. If it is not empty, delete the object pointed to by front and decrement front to complete dequeue.
The running results are as follows:
小苗:哥进队了! 入队成功 马帅:哥进队了! 入队成功 溜冰:哥进队了! 入队成功 张世佳:我一来咋就满了!(队满不能入队,请等待!) 小苗:哥走了! 出队成功! 周瑞晓:哥进队了! 入队成功 马帅:哥走了! 出队成功! 溜冰:哥走了! 出队成功! 周瑞晓:哥走了! 出队成功! 队空不能出队! 队空不能出队!
The above is the detailed content of Does php have a queue concept?. For more information, please follow other related articles on the PHP Chinese website!