找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1904|回复: 0
打印 上一主题 下一主题

php实现的双向队列类实例

[复制链接]

3444

主题

3465

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11142
跳转到指定楼层
楼主
发表于 2018-2-14 05:54:24 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

            本文实例讲述了php实现的双向队列类及其用法,对于PHP数据结构与算法的学习有不错的参考价值。分享给大家供大家参考。具体分析如下:
(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构。双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
在实际使用中,还可以有输出受限的双向队列(即一个端点允许插入和删除,另一个端点只允许插入的双向队列)和输入受限的双向队列(即一个端点允许插入和删除,另一个端点只允许删除的双向队列)。而如果限定双向队列从某个端点插入的元素只能从该端点删除,则该双向队列就蜕变为两个栈底相邻的栈了。
DEQue.class.php类文件如下:
_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示例代码如下:
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)
  • PHP使用数组实现队列
  • 关于PHP堆栈与列队的学习
  • php线性表的入栈与出栈实例分析
  • php基于双向循环队列实现历史记录的前进后退等功能
  • PHP基于堆栈实现的高级计算器功能示例
  • PHP实现的链式队列结构示例
  • PHP实现基于栈的后缀表达式求值功能
  • PHP实现的栈数据结构示例【入栈、出栈、遍历栈】
  • PHP基于数组实现的堆栈和队列功能示例
  • PHP使用两个栈实现队列功能的方法
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端