php实现的双向队列类实例


Posted in PHP onSeptember 24, 2014

本文实例讲述了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 相关文章推荐
snoopy PHP版的网络客户端提供本地下载
Apr 15 PHP
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
PHP中extract()函数的定义和用法
Aug 17 PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
Sep 26 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
Jun 19 PHP
PHP中error_log()函数的使用方法
Jan 20 PHP
php开发微信支付获取用户地址
Oct 04 PHP
php获取一定范围内取N个不重复的随机数
May 28 PHP
php 生成Tab键或逗号分隔的CSV
Sep 24 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 PHP
php实现的Timer页面运行时间监测类
Sep 24 #PHP
php密码生成类实例
Sep 24 #PHP
PHP中file_get_contents高?用法实例
Sep 24 #PHP
php实现的Cookies操作类实例
Sep 24 #PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
Sep 24 #PHP
php过滤html标记属性类用法实例
Sep 23 #PHP
php广告加载类用法实例
Sep 23 #PHP
You might like
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
浅析get与post的一些特殊情况
2014/07/28 PHP
PHP SOCKET编程详解
2015/05/22 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
Dojo 学习要点
2010/09/03 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
Javascrip实现文字跳动特效
2016/11/27 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
详解在React里使用&quot;Vuex&quot;
2018/04/02 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
python 删除列表里所有空格项的方法总结
2018/04/18 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
python实现简单井字棋小游戏
2020/03/05 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
广州迈达威.net面试题目
2012/03/10 面试题
建筑项目策划书
2014/01/13 职场文书
高中军训感言400字
2014/02/24 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏