PHP写一个双向队列,其实是在考察PHP几个内置数组的函数
```
用PHP写一个双向队列
class Deque{
public$queue=array();
/**
* 尾部入对
* @param [type] $value [description]
*/publicfunctionaddLast($value){
returnarray_push($this->queue,$value);
}
/**
* 尾部出队
* @return [type] [description]
*/publicfunction removeLast(){
returnarray_pop($this->queue);
}
/**
* 头部入队
* @param [type] $value [description]
*/publicfunctionaddFirst($value){
returnarray_unshift($this->queue,$value);
}
/**
* 头部出队
* @return [type] [description]
*/publicfunction removeFirst(){
returnarray_shift($this->queue);
}
/**
* 清空队列
* @return [type] [description]
*/publicfunction makeEmpty(){
unset($this->queue);
}
/**
* 获取列头
* @return [type] [description]
*/publicfunction getFirst(){
returnreset($this->queue);
}
/**
* 获取列尾
* @return [type] [description]
*/publicfunction getLast(){
returnend($this->queue);
}
/**
* 获取长度
* @return [type] [description]
*/publicfunction getLength(){
returncount($this->queue);
}
}
?>
加上一些限制条件后:
<?php
/** php 双向队列。支持限定队列长度,输入受限,输出受限,及输出必须与输入同端几种设置
* Func:
* public frontAdd 前端入列
* public frontRemove 前端出列
* public rearAdd 后端入列
* pulbic rearRemove 后端出列
* public clear 清空对列
* public isFull 判断对列是否已满
* private getLength 获取对列长度
* private setAddNum 记录入列,输出依赖输入时调用
* private setRemoveNum 记录出列,输出依赖输入时调用
* private checkRemove 检查是否输出依赖输入 */
classDEQue{
// class start 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 对列最大长度
*/
public function__construct($type=1,$maxlength=0){
$this->_type =in_array($type,array(1,2,3,4,5,6))?$type: 1;
$this->_maxLength =intval($maxlength);
}
// 前端入列
// @param Mixed $data 数据
//@return boolean publicfunctionfrontAdd($data=null){
if($this->_type==3){// 前端输入限制 returnfalse;
}
if(isset($data) && !$this->isFull()){
array_unshift($this->_queue,$data);
$this->setAddNum(1);
returntrue;
}
returnfalse;
}
//前端出列
//@return Arraypublicfunction frontRemove(){
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;
}
// 后端入列
// @param Mixed $data 数据
//@return boolean publicfunctionrearAdd($data=null){
if($this->_type==5){// 后端输入限制 returnfalse;
}
if(isset($data) && !$this->isFull()){
array_push($this->_queue,$data);
$this->setAddNum(2);
returntrue;
}
returnfalse;
}
// 后端出列
// @return Array publicfunction rearRemove(){
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;
}
//清空对列
//@return boolean publicfunction clear(){
$this->_queue =array();
$this->_frontNum = 0;
$this->_rearNum = 0;
returntrue;
}
//判断对列是否已满
//@return boolean publicfunction isFull(){
$bIsFull=false;
if($this->_maxLength!=0 &&$this->_maxLength==$this->getLength()){
$bIsFull=true;
}
return$bIsFull;
}
//获取当前对列长度
//@return int privatefunction getLength(){
returncount($this->_queue);
}
//记录入列,输出依赖输入时调用
// @param int $endpoint 端点 1:front 2:rear privatefunctionsetAddNum($endpoint){
if($this->_type==6){
if($endpoint==1){
$this->_frontNum ++;
}else{
$this->_rearNum ++;
}
}
}
//记录出列,输出依赖输入时调用
//@param int $endpoint 端点 1:front 2:rear privatefunctionsetRemoveNum($endpoint){
if($this->_type==6){
if($endpoint==1){
$this->_frontNum --;
}else{
$this->_rearNum --;
}
}
}
//检查是否输出依赖输入
//@param int $endpoint 端点 1:front 2:rear privatefunctioncheckRemove($endpoint){
if($this->_type==6){
if($endpoint==1){
return$this->_frontNum>0;
}else{
return$this->_rearNum>0;
}
}
returntrue;
}
} // class end