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程序算法设计的学习有所帮助。