在本篇文章里小编给大家整顿的是一篇对于 php 双向队列如何了解的相干内容及实例,须要的敌人们能够跟着学习下。
1、双向队列是指一种具备队列和栈的性质的数据结构。
2、双向队列中的元素能够从两端弹出,其限定插入和删除操作在表的两端进行。
双向队列就像是一个队列,然而你能够在任何一端增加或移除元素。
实例
<?php
class DoubleQueue
{public $queue = array();
/**(尾部)入队 **/
public function addLast($value)
{return array_push($this->queue,$value);
}
/**(尾部)出队 **/
public function removeLast()
{return array_pop($this->queue);
}
/**(头部)入队 **/
public function addFirst($value)
{return array_unshift($this->queue,$value);
}
/**(头部)出队 **/
public function removeFirst()
{return array_shift($this->queue);
}
/** 清空队列 **/
public function makeEmpty()
{unset($this->queue);
}
/** 获取列头 **/
public function getFirst()
{return reset($this->queue);
}
/** 获取列尾 **/
public function getLast()
{return end($this->queue);
}
/** 获取长度 **/
public function getLength()
{return count($this->queue);
}
}
实例扩大:
(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);
?>