首页后端开发其他后端知识详解什么是PHP双向队列及实例是怎样

详解什么是PHP双向队列及实例是怎样

时间2024-03-25 09:34:03发布访客分类其他后端知识浏览807
导读:关于“详解什么是PHP双向队列及实例是怎样”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“详解什么是PHP双向队列及...
关于“详解什么是PHP双向队列及实例是怎样”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“详解什么是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);
     
 
?>
     



现在大家对于详解什么是PHP双向队列及实例是怎样的内容应该都清楚了吧,希望大家阅读完这篇文章能有所收获。最后,想要了解更多详解什么是PHP双向队列及实例是怎样的知识,欢迎关注网络,网络将为大家推送更多相关知识的文章。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

php

若转载请注明出处: 详解什么是PHP双向队列及实例是怎样
本文地址: https://pptw.com/jishu/652692.html
在javascript里面split方法如何使用呢? PHP用户信息乱码的情况有哪些,怎样解决?

游客 回复需填写必要信息