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 相关文章推荐
php初学者写及时补给skype用户充话费的小程序
Nov 02 PHP
php SQL之where语句生成器
Mar 24 PHP
php 魔术函数使用说明
Feb 21 PHP
PHP初学者最感迷茫的问题小结
Mar 27 PHP
PHP 观察者模式的实现代码
May 10 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
php解析http获取的json字符串变量总是空白null
Mar 02 PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 PHP
PHP中类属性与类静态变量的访问方法示例
Jul 13 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
PHP封装cURL工具类与应用示例
Jul 01 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
如何用php获取文件名后缀
2013/06/09 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
php网页病毒清除类
2014/12/08 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
extjs form textfield的隐藏方法
2008/12/29 Javascript
JavaScript 事件查询综合
2009/07/13 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
React中的render何时执行过程
2018/04/13 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
python tkinter界面居中显示的方法
2018/10/11 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
python实现银行实战系统
2020/02/26 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
css3闪亮进度条效果实现思路及代码
2013/04/17 HTML / CSS
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
高中毕业生生活的自我评价
2013/12/08 职场文书
趣味运动会活动方案
2014/02/12 职场文书
群众路线对照检查材料
2014/09/22 职场文书
Python制作动态字符画的源码
2021/08/04 Python
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技