PHP队列是什么?如何实现?(代码示例)
来源:转载
发布时间:2018-11-23 11:30:57
阅读量:810
本篇文章就大家带来的内容是介绍PHP队列是什么?如何实现?(代码示例)。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。
队列是一种特殊的线性表,它只允许在表的前端,可以称之为front,进行删除操作;而在表的后端,可以称之为rear进行插入操作。
队列和堆栈一样,是一种操作受限制的线性表,和堆栈不同之处在于:队列是遵循“先进先出”原则,而堆栈遵循的是“先进后出”原则。
队列进行插入操作的端称为队尾,进行删除操作的称为队头,只允许在队尾进行插入操作,在队头进行删除操作。
队列的数据元素又称为队列元素,在队尾中插入一个元素称为入队,在队头删除一个元素称为出队。
具体实现参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | <?php
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 --){
if ( $this ->queue[ $i ])unset( $this ->queue[ $i ]);
$this ->queue[ $i ]= $this ->queue[ $i -1];
}
$this ->queue[ $this ->rear+1]= new data( $data );
echo '入队成功!<br>' ;
}
}
public function OutQ(){
if ( $this ->QIsEmpty()) echo "队空不能出队!<br>" ;
else {
unset( $this ->queue[ $this ->front]);
$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();
|
本案例中有两个类:
第一个是data类,用于实现数据的存放以及队列元素的入队出队情况;
第二个是queue类,用于队列元素的一些入队出队操作。
队列中包含四个属性:
front(队列的头部)
rear(队列的尾部)
maxsize(队列的长度,即队列元素个数)
queue(存放所有已入队队列元素的对象)
场景说明:
1.初始化队列时,生成一个队列,传入一个参数作为maxsize初始化队列把队尾rear设为0,队头front也设为0,此时queue中只有0号元素,并且rear和front都指向它。
2.入队时,先需要判断队列是否已满(front-rear == maxsize),如果已满不可在插入,如果未满则允许插入。插入时,front自增,然后依次让队列所有元素向前移动一位(让出队尾位置以便插入新元素),然后生成新的data对象插入到队尾位置。
3.出队时,判断队列是否为空(front == rear),如果为空时,无法出队。如果不为空时,删除front指向的对象,并且front自减,完成出队。
运行结果如下: