队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素成为出队。因为队列只允许在一段插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
在PHP中,队列经常用来做消息队列和任务队列等,是一个非常有用的机构。小弟初学,这里简单的介绍下队列的基本结构和操作。
1.顺寻队列
PHP中的顺序队列非常简单,简单的几行就能够实现。
<?php
class Queue{
private $Que=array();
//入队
public function Enqueue($data){
return array_push($this->Que,$data);
}
//出队
public function DelQue(){
return array_shift($this->Que);
}
}
>
这样就简单的实现了PHP版本的顺序队列。
2.链式队列
链式队列属于常用队列,这里我简单的写了一下链式队列的构造方法和基本操作:
<?php
//定义链式队列的成员
class Qnode{
public $data;//成员数据
public $next;//指向下一成员
public $id;//成员id
public function __construct($data=NULL,$next=NULL,$id=0){
$this->data=$data;
$this->next=$next;
$this->id=$id;
}
}
//定义队列
class LinkQueue{
private $front;//队头
private $rear;//队尾
public function __construct(){
$this->front=new Qnode($data=NULL,$next=NULL,$id=0);
$this->rear=$this->front;
}
//定义入队
public function EnQueue($data){
$front=$this->front;
$q = new Qnode($data,NULL,$this->rear->id+1);
$this->rear->next=$q;
$this->rear=$q;
}
//出队
public function DelQueue(){
$temp=$this->front->next->data;
$this->front=$this->front->next;
$this->front->data=NULL;
return $temp;
}
//获取队列长度
public function GetLength(){
return ($this->rear->id-$this->front->id);
}
//获取队列
public function GetLinkQueue(){
$front=$this->front;
while($front != $this->rear){
$front=$front->next;
echo '第'.$front->id.'个成员为'.$front->data.'<br>';
}
}
}
$a =new LinkQueue;
$a->Enqueue('a');
$a->Enqueue('b');
$a->Enqueue('c');
$a->Enqueue('d');
$a->Enqueue(3);
echo '出队以前总共有'.$a->GetLength().'个队员<br>';
echo $a->DelQueue().'执行出队以后<br>';
echo $a->GetLinkQueue();
echo '一共剩余'.$a->GetLength().'个队员';
?>
最后几行为测试代码,以下是结果:
希望可以帮助大家理解链表结构,小弟初学,要是有地方写的不够透彻,希望大家多多包含。