php实现的双向队列类实例

 更新时间:2014年09月24日 14:53:31   投稿:shichen2014   我要评论
这篇文章主要介绍了php实现的双向队列类,是数据结构中非常重要的一个数据结构类型,需要的朋友可以参考下

本文实例讲述了php实现的双向队列类及其用法,对于PHP数据结构与算法的学习有不错的参考价值。分享给大家供大家参考。具体分析如下:

(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与Java对比学习日期时间函数

    PHP与Java对比学习日期时间函数

    本文给大家介绍的是从Java和PHP进行对比复习了下日期时间的处理函数,并给出了一些示例,希望对大家能够有所帮助
    2016-07-07
  • PHP INT类型在内存中占字节详解

    PHP INT类型在内存中占字节详解

    在本文里我们给大家分享了关于PHP输出INT类型在内存中占多少个字节的相关知识点,需要的朋友们参考下。
    2019-07-07
  • PHP引用返回用法示例

    PHP引用返回用法示例

    这篇文章主要介绍了PHP引用返回的用法,结合实例形式分析了针对函数参数及函数的引用使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • ThinkPHP安装和设置

    ThinkPHP安装和设置

    本文是ThinkPHP的系列教程的第一篇,本系列一共七篇,我们将从简到难,由浅入深,给大家详细介绍这款优秀的国产开源php框架,有需要的小伙伴可以关注下。
    2015-07-07
  • 修改PHP的memory_limit限制的方法分享

    修改PHP的memory_limit限制的方法分享

    在运行PHP程序,通常会遇到“Fatal Error: Allowed memory size of xxxxxx bytes exhausted”的错误, 这个意味着PHP脚本使用了过多的内存,并超出了系统对其设置的允许最大内存
    2012-02-02
  • PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID

    PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID

    向mysql 插入数据时,很多时候我们想知道刚刚插入数据的id,这对我们很有用。下面这篇文章就详细给大家介绍了利用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID,有需要的朋友们可以参考借鉴,感兴趣的朋友们下面来一起看看吧。
    2016-11-11
  • 静态html文件执行php语句的方法(推荐)

    静态html文件执行php语句的方法(推荐)

    下面小编就为大家带来一篇静态html文件执行php语句的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Windows2003下php5.4安装配置教程(IIS)

    Windows2003下php5.4安装配置教程(IIS)

    这篇文章主要为大家详细介绍了在Windows2003下IIS与php5.4配置教程,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • php使用fgetcsv读取csv文件出现乱码的解决方法

    php使用fgetcsv读取csv文件出现乱码的解决方法

    这篇文章主要介绍了php使用fgetcsv读取csv文件出现乱码的解决方法,实例分析了造成乱码的原因与对应的解决方法,并给出了Linux平台下的乱码解决方法,需要的朋友可以参考下
    2014-11-11
  • php面向对象之反射功能与用法分析

    php面向对象之反射功能与用法分析

    这篇文章主要介绍了php面向对象之反射功能与用法,结合实例形式简单分析了php5面向对象反射的概念及具体用法,需要的朋友可以参考下
    2017-03-03

最新评论