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);

  ?>

时间: 2024-12-26 10:35:13

php实现的双向队列类实例的相关文章

php实现的双向队列类实例_php技巧

本文实例讲述了php实现的双向队列类及其用法,对于PHP数据结构与算法的学习有不错的参考价值.分享给大家供大家参考.具体分析如下: (deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构.双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行. 在实际使用中,还可以有输出受限的双向队列(即一个端点允许插入和删除,另一个端点只允许插入的双向队列)和输入受限的双向队列(即一个端点允许插入和删除,另一个端点只允许删除的双向队列).而如果限定双向队列从某个

php的双向队列类

(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构.双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行. 在实际使用中,还可以有输出受限的双向队列(即一个端点允许插入和删除,另一个端点只允许插入的双向队列)和输入受限的双向队列(即一个端点允许插入和删除,另一个端点只允许删除的双向队列).而如果限定双向队列从某个端点插入的元素只能从该端点删除,则该双向队列就蜕变为两个栈底相邻的栈了. DEQue.class.php <?php /** php

php的memcache类分享(memcache队列)_php实例

memcacheQueue.class.php 复制代码 代码如下: <?php/** * PHP memcache 队列类 * @author LKK/lianq.net * @version 0.3 * @修改说明: * 1.放弃了之前的AB面轮值思路,使用类似数组的构造,重写了此类. * 2.队列默认先进先出,但增加了反向读取功能. * 3.感谢网友FoxHunter提出的宝贵意见. * @example: * $obj = new memcacheQueue('duilie'); * $

PHP队列用法实例_php技巧

本文实例讲述了PHP队列用法.分享给大家供大家参考.具体分析如下: 什么是队列,是先进先出的线性表,在具体应用中通常用链表或者数组来实现,队列只允许在后端进行插入操作,在前端进行删除操作. 什么情况下会用了队列呢,并发请求又要保证事务的完整性的时候就会用到队列,当然不排除使用其它更好的方法,知道的不仿说说看. 队列还可以用于减轻数据库服务器压力,我们可以将不是即时数据放入到队列中,在数据库空闲的时候或者间隔一段时间后执行.比如访问计数器,没有必要即时的执行访问增加的Sql,在没有使用队列的时候s

如何在普通类实例的线程过程中,同步调用执行在类实例自身所在的原来的那个线程中的方法

问题描述 如何在普通类实例的线程过程中,同步调用执行在类实例自身所在的原来的那个线程中的方法如后代码,是一个常见的实例,讲的是通过Control.Invoke在线程函数中,同步调用窗体主线程中的Form1实例的普通方法txt.但问题是,很多时候我们自己自定义的类,并不是从Control类继承的,从而也没有这个功能的Invoke方法供调用,这种类要怎么设计呢?虽然说用的示例代码是vb.net的,但严格来说,这个和语言无关,是一个.net开发的基本问题.ImportsSystemImportsSys

PHP验证码类实例

 这篇文章主要介绍了一个好用的PHP验证码类实例,有需要的朋友可以参考一下 分享一个好用的php验证码类,包括调用示例. 说明: 如果不适用指定的字体,那么就用imagestring()函数,如果需要遇到指定的字体,就要用到imagettftext()函数.字体的位置在C盘下Windows/Fonts.   参考了网上的php 生成验证码的方法,以及php 图片验证码和php 中文验证码的生成方法.用到了PHP GD库的相关知识.   1,生成验证码的类 VerificationCode.cla

AS 3.0 TransitionManager类实例

如何运用 AS 3.0的 TransitionManager类制作动画 TransitionManager 类让你应用不同的动画效果到影片剪辑.整体来说,有十个不同的动画可以用.这些是:遮帘过渡.淡化过渡.飞行过渡.光圈过渡.相片过渡, 像素溶解过渡,挤压过渡.旋转过渡.划入/划出和缩放过渡. 1.新Flash文件,设置宽.高为:700 × 400 ,背景颜色任意. 2.导入一张 100 × 100的图片到舞台. 3.右键单击图片,转换成影片剪辑.命名为 " box " 设定注册点到中

ruby中的类变量与类实例变量

首先,在ruby1.8中类变量是所有子类和父类共享的,可以看下面的代码: class IntelligentLife @@home_planet = nil def self.home_planet @@home_planet end def self.home_planet=(x) @@home_planet = x end #... end class Terran < IntelligentLife @@home_planet = "Earth" end class Mar

编写一个JAVA的队列类

  根据这些特点,对队列定义了以下六种操作: enq(x) 向队列插入一个值为x的元素; deq() 从队列删除一个元素; front() 从队列中读一个元素,但队列保持不变; empty() 判断队列是否为空,空则返回真; clear() 清空队列; search(x) 查找距队首最近的元素的位置,若不存在,返回-1. Vector类是JAVA中专门负责处理对象元素有序存储和任意增删的类,因此,用Vector 可以快速实现JAVA的队列类. public class Queue extends