The queue is a special linear table that only allows deletion operations at the front end of the table, which can be called front; and insertion operations at the back end of the table, which can be called rear. The queue, like the stack, is a linear list with restricted operations. The difference from the stack is that the queue follows the "first in, 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:
Code:
<?php /** * php队列算法 * 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 one is The data class is used to realize the storage of data and the enqueuing and dequeuing of queue elements;
The second 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)
Scenario description:
1. When initializing the queue, generate a queue, pass in a parameter as maxsize, initialize the queue, set the rear of the queue to 0, and set 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 the dequeue.
The running results are as follows:
小苗:哥进队了! 入队成功 马帅:哥进队了! 入队成功 溜冰:哥进队了! 入队成功 张世佳:我一来咋就满了!(队满不能入队,请等待!) 小苗:哥走了! 出队成功! 周瑞晓:哥进队了! 入队成功 马帅:哥走了! 出队成功! 溜冰:哥走了! 出队成功! 周瑞晓:哥走了! 出队成功! 队空不能出队! 队空不能出队!
The above is the detailed content of Detailed steps to implement PHP queue (easy to understand). For more information, please follow other related articles on the PHP Chinese website!