温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

php双向队列的实例分析

发布时间:2021-11-05 11:10:13 来源:亿速云 阅读:182 作者:柒染 栏目:开发技术

php双向队列的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1、双向队列是指一种具有队列和栈的性质的数据结构。

2、双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

双向队列就像是一个队列,但是你可以在任何一端添加或移除元素。

实例

<?php class DoubleQueue {     public $queue = array();     /**(尾部)入队  **/     public function addLast($value)     {         return array_push($this->queue,$value);     }     /**(尾部)出队**/     public function removeLast()     {           return array_pop($this->queue);       }       /**(头部)入队**/       public function addFirst($value)       {         return array_unshift($this->queue,$value);       }       /**(头部)出队**/     public function removeFirst()     {         return array_shift($this->queue);     }     /**清空队列**/     public function makeEmpty()     {         unset($this->queue);     }     /**获取列头**/     public function getFirst()     {         return reset($this->queue);     }     /** 获取列尾 **/     public function getLast()     {         return end($this->queue);     }     /** 获取长度 **/     public function getLength()     {         return count($this->queue);     } }

实例扩展:

(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构。双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

在实际使用中,还可以有输出受限的双向队列(即一个端点允许插入和删除,另一个端点只允许插入的双向队列)和输入受限的双向队列(即一个端点允许插入和删除,另一个端点只允许删除的双向队列)。而如果限定双向队列从某个端点插入的元素只能从该端点删除,则该双向队列就蜕变为两个栈底相邻的栈了。

DEQue.class.php类文件如下:

<?php  /** php 双向队列。支持限定队列长度,输入受限,输出受限,及输出必须与输入同端几种设置  *  Date:  2014-04-30  *  Author: fdipzone  *  Ver:  1.0  *  *  Func:  *  public frontAdd   前端入列  *  public frontRemove 前端出列  *  public rearAdd   后端入列  *  pulbic rearRemove  后端出列  *  public clear    清空对列  *  public isFull    判断对列是否已满  *  private getLength  获取对列长度  *  private setAddNum  记录入列,输出依赖输入时调用  *  private setRemoveNum 记录出列,输出依赖输入时调用  *  private checkRemove 检查是否输出依赖输入  */    class DEQue{ // 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    */    public function frontAdd($data=null){        if($this->_type==3){ // 前端输入限制        return false;      }        if(isset($data) && !$this->isFull()){          array_unshift($this->_queue, $data);          $this->setAddNum(1);          return true;      }      return false;    }      /** 前端出列    * @return Array    */    public function frontRemove(){        if($this->_type==2){ // 前端输出限制        return null;      }        if(!$this->checkRemove(1)){ // 检查是否依赖输入        return null;      }        $data = null;        if($this->getLength()>0){          $data = array_shift($this->_queue);          $this->setRemoveNum(1);      }      return $data;    }      /** 后端入列    * @param Mixed  $data 数据    * @return boolean    */    public function rearAdd($data=null){        if($this->_type==5){ // 后端输入限制        return false;      }        if(isset($data) && !$this->isFull()){          array_push($this->_queue, $data);          $this->setAddNum(2);          return true;      }      return false;    }      /** 后端出列    * @return Array    */    public function rearRemove(){        if($this->_type==4){ // 后端输出限制        return null;      }        if(!$this->checkRemove(2)){ // 检查是否依赖输入        return null;      }        $data = null;        if($this->getLength()>0){          $data = array_pop($this->_queue);          $this->setRemoveNum(2);      }      return $data;    }      /** 清空对列    * @return boolean    */    public function clear(){      $this->_queue = array();      $this->_frontNum = 0;      $this->_rearNum = 0;      return true;    }      /** 判断对列是否已满    * @return boolean    */    public function isFull(){      $bIsFull = false;      if($this->_maxLength!=0 && $this->_maxLength==$this->getLength()){        $bIsFull = true;      }      return $bIsFull;    }      /** 获取当前对列长度    * @return int    */    private function getLength(){      return count($this->_queue);    }      /** 记录入列,输出依赖输入时调用    * @param int $endpoint 端点 1:front 2:rear    */    private function setAddNum($endpoint){      if($this->_type==6){        if($endpoint==1){          $this->_frontNum ++;        }else{          $this->_rearNum ++;        }      }    }      /** 记录出列,输出依赖输入时调用    * @param int $endpoint 端点 1:front 2:rear    */    private function setRemoveNum($endpoint){      if($this->_type==6){        if($endpoint==1){          $this->_frontNum --;        }else{          $this->_rearNum --;        }      }    }      /** 检查是否输出依赖输入    * @param int $endpoint 端点 1:front 2:rear    */    private function checkRemove($endpoint){      if($this->_type==6){        if($endpoint==1){          return $this->_frontNum>0;        }else{          return $this->_rearNum>0;        }      }      return true;    }  } // class end  ?>

demo.php示例代码如下:

<?php    require "DEQue.class.php";    // 例子1    $obj = new DEQue(); // 前后端都可以输入,无限长度    $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 = new DEQue(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 = new DEQue(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);    ?>

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI