PHP写一个双向队列,其实是在考察PHP几个内置数组的函数

用PHP写一个双向队列
<?php
class Deque{
public $queue = array();
/**
* 尾部入对
* @param [type] $value [description]
*/
public function addLast($value){
return array_push($this->queue,$value);
}
/**
* 尾部出队
* @return [type] [description]
*/
public function removeLast(){
return array_pop($this->queue);
}
/**
* 头部入队
* @param [type] $value [description]
*/
public function addFirst($value){
return array_unshift($this->queue, $value);
}
/**
* 头部出队
* @return [type] [description]
*/
public function removeFirst(){
return array_shift($this->queue);
}
/**
* 清空队列
* @return [type] [description]
*/
public function makeEmpty(){
unset($this->queue);
}
/**
* 获取列头
* @return [type] [description]
*/
public function getFirst(){
return reset($this->queue);
}
/**
* 获取列尾
* @return [type] [description]
*/
public function getLast(){
return end($this->queue);
}
/**
* 获取长度
* @return [type] [description]
*/
public function getLength(){
return count($this->queue);
}
}
?>
加上一些限制条件后:
<?php
/** php 双向队列。支持限定队列长度,输入受限,输出受限,及输出必须与输入同端几种设置
* 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
?>

最新文章

  1. android自定义控件(5)-实现ViewPager效果
  2. Pyqt Smtplib实现Qthread多线程发送邮件
  3. [under the hood]Reduce EXE and DLL Size with LIBCTINY.LIB
  4. 网站构建学习笔记(0)&mdash;&mdash;基本概念了解及资源学习(copy自w3school)
  5. javaWeb el表达式和jstl快速入门案例
  6. lua学习:游戏中的Lua
  7. &lt;转&gt;Python运行的17个时新手常见错误小结
  8. JavaScript入门(1)
  9. 快速查询本机IP 分类: windows常用小技巧 2014-04-15 09:28 138人阅读 评论(0) 收藏
  10. Entity Framework排序
  11. 自定义ComboBox,简简单单实现
  12. jquery中的选择器01
  13. Java设计模式之--------&gt;&quot;代理模式&quot;
  14. 浅谈php的优缺点
  15. ajax---&gt;简单加法小练习
  16. Python深度学习(Deep Learning with Python) 中文版+英文版+源代码
  17. PHP中 PCRE正则表达式模式修饰符“u” 的使用。
  18. dp入门(LIS,LCS)
  19. English trip V1 - 11.What&#39;s That? 那是什么?Teacher:Patrick Key:There&#39;s/There are
  20. 普通数组和json数组的区别

热门文章

  1. An error occurred at line: 1 in the generated java file问题处理
  2. leetcode笔记(二)94. Binary Tree Inorder Traversal
  3. thinkphp 跳转外网代码(php通用)
  4. phpmailer类的再封装
  5. tcl之string操作-length/index/range/replace
  6. yii2 的登录注册 轮子
  7. python 初学函数
  8. HDU 3364 高斯消元
  9. TouTiao开源项目 分析笔记15 新闻详情之两种类型的实现
  10. mac上MySQLdb问题解决