php实现的双向队列类实例
本文实例讲述了php实现的双向队列类及其用法,对于PHP数据结构与算法的学习有不错的参考价值。分享给大家供大家参考。具体分析如下:
(deque,全名double-endedqueue)是一种具有队列和栈的性质的数据结构。双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
在实际使用中,还可以有输出受限的双向队列(即一个端点允许插入和删除,另一个端点只允许插入的双向队列)和输入受限的双向队列(即一个端点允许插入和删除,另一个端点只允许删除的双向队列)。而如果限定双向队列从某个端点插入的元素只能从该端点删除,则该双向队列就蜕变为两个栈底相邻的栈了。
DEQue.class.php类文件如下:
<?php
/**php双向队列。支持限定队列长度,输入受限,输出受限,及输出必须与输入同端几种设置
*Date:2014-04-30
*Author:fdipzone
*Ver:1.0
*
*Func:
*publicfrontAdd前端入列
*publicfrontRemove前端出列
*publicrearAdd后端入列
*pulbicrearRemove后端出列
*publicclear清空对列
*publicisFull判断对列是否已满
*privategetLength获取对列长度
*privatesetAddNum记录入列,输出依赖输入时调用
*privatesetRemoveNum记录出列,输出依赖输入时调用
*privatecheckRemove检查是否输出依赖输入
*/
classDEQue{//classstart
private$_queue=array();//对列
private$_maxLength=0;//对列最大长度,0表示不限
private$_type=0;//对列类型
private$_frontNum=0;//前端插入的数量
private$_rearNum=0;//后端插入的数量
/**初始化
*@param$type对列类型
*1:两端均可输入输出
*2:前端只能输入,后端可输入输出
*3:前端只能输出,后端可输入输出
*4:后端只能输入,前端可输入输出
*5:后端只能输出,前端可输入输出
*6:两端均可输入输出,在哪端输入只能从哪端输出
*@param$maxlength对列最大长度
*/
publicfunction__construct($type=1,$maxlength=0){
$this->_type=in_array($type,array(1,2,3,4,5,6))?$type:1;
$this->_maxLength=intval($maxlength);
}
/**前端入列
*@paramMixed$data数据
*@returnboolean
*/
publicfunctionfrontAdd($data=null){
if($this->_type==3){//前端输入限制
returnfalse;
}
if(isset($data)&&!$this->isFull()){
array_unshift($this->_queue,$data);
$this->setAddNum(1);
returntrue;
}
returnfalse;
}
/**前端出列
*@returnArray
*/
publicfunctionfrontRemove(){
if($this->_type==2){//前端输出限制
returnnull;
}
if(!$this->checkRemove(1)){//检查是否依赖输入
returnnull;
}
$data=null;
if($this->getLength()>0){
$data=array_shift($this->_queue);
$this->setRemoveNum(1);
}
return$data;
}
/**后端入列
*@paramMixed$data数据
*@returnboolean
*/
publicfunctionrearAdd($data=null){
if($this->_type==5){//后端输入限制
returnfalse;
}
if(isset($data)&&!$this->isFull()){
array_push($this->_queue,$data);
$this->setAddNum(2);
returntrue;
}
returnfalse;
}
/**后端出列
*@returnArray
*/
publicfunctionrearRemove(){
if($this->_type==4){//后端输出限制
returnnull;
}
if(!$this->checkRemove(2)){//检查是否依赖输入
returnnull;
}
$data=null;
if($this->getLength()>0){
$data=array_pop($this->_queue);
$this->setRemoveNum(2);
}
return$data;
}
/**清空对列
*@returnboolean
*/
publicfunctionclear(){
$this->_queue=array();
$this->_frontNum=0;
$this->_rearNum=0;
returntrue;
}
/**判断对列是否已满
*@returnboolean
*/
publicfunctionisFull(){
$bIsFull=false;
if($this->_maxLength!=0&&$this->_maxLength==$this->getLength()){
$bIsFull=true;
}
return$bIsFull;
}
/**获取当前对列长度
*@returnint
*/
privatefunctiongetLength(){
returncount($this->_queue);
}
/**记录入列,输出依赖输入时调用
*@paramint$endpoint端点1:front2:rear
*/
privatefunctionsetAddNum($endpoint){
if($this->_type==6){
if($endpoint==1){
$this->_frontNum++;
}else{
$this->_rearNum++;
}
}
}
/**记录出列,输出依赖输入时调用
*@paramint$endpoint端点1:front2:rear
*/
privatefunctionsetRemoveNum($endpoint){
if($this->_type==6){
if($endpoint==1){
$this->_frontNum--;
}else{
$this->_rearNum--;
}
}
}
/**检查是否输出依赖输入
*@paramint$endpoint端点1:front2:rear
*/
privatefunctioncheckRemove($endpoint){
if($this->_type==6){
if($endpoint==1){
return$this->_frontNum>0;
}else{
return$this->_rearNum>0;
}
}
returntrue;
}
}//classend
?>
demo.php示例代码如下:
<?php
require"DEQue.class.php";
//例子1
$obj=newDEQue();//前后端都可以输入,无限长度
$obj->frontAdd('a');//前端入列
$obj->rearAdd('b');//后端入列
$obj->frontAdd('c');//前端入列
$obj->rearAdd('d');//后端入列
//入列后数组应为cabd
$result=array();
$result[]=$obj->rearRemove();//后端出列
$result[]=$obj->rearRemove();//后端出列
$result[]=$obj->frontRemove();//前端出列
$result[]=$obj->frontRemove();//前端出列
print_r($result);//出列顺序应为dbca
//例子2
$obj=newDEQue(3,5);//前端只能输出,后端可输入输出,最大长度5
$insert=array();
$insert[]=$obj->rearAdd('a');
$insert[]=$obj->rearAdd('b');
$insert[]=$obj->frontAdd('c');//因前端只能输出,因此这里会返回false
$insert[]=$obj->rearAdd('d');
$insert[]=$obj->rearAdd('e');
$insert[]=$obj->rearAdd('f');
$insert[]=$obj->rearAdd('g');//超过长度,返回false
var_dump($insert);
//例子3
$obj=newDEQue(6);//输出依赖输入
$obj->frontAdd('a');
$obj->frontAdd('b');
$obj->frontAdd('c');
$obj->rearAdd('d');
$result=array();
$result[]=$obj->rearRemove();
$result[]=$obj->rearRemove();//因为输出依赖输入,这个会返回NULL
$result[]=$obj->frontRemove();
$result[]=$obj->frontRemove();
$result[]=$obj->frontRemove();
var_dump($result);
?>
完整实例代码点击此处本站下载。
希望本文所述对大家PHP程序算法设计的学习有所帮助。