美文网首页
用PHP写一个双向队列

用PHP写一个双向队列

作者: ChinaLeee | 来源:发表于2018-07-03 00:48 被阅读0次

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

相关文章

网友评论

      本文标题:用PHP写一个双向队列

      本文链接:https://www.haomeiwen.com/subject/czwruftx.html