用PHP写一个双向队列
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
?>
用PHP写一个双向队列的更多相关文章
- 用ES6的class模仿Vue写一个双向绑定
原文地址:用ES6的class模仿Vue写一个双向绑定 点击在线尝试一下 最终效果如下: 构造器(constructor) 构造一个TinyVue对象,包含基本的el,data,methods cla ...
- 用过消息队列?Kafka?能否手写一个消息队列?懵
是否有同样的经历?面试官问你做过啥项目,我一顿胡侃,项目利用到了消息队列,kafka,rocketMQ等等. 好的,那请开始你的表演,面试官递过一支笔:给我手写一个消息队列!!WHAT? 为了大家遇到 ...
- PHP — 用PHP实现一个双向队列
1.简介 deque,全名double-ended queue,是一种具有队列和栈的性质的数据结构.双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行.双向队列(双端队列)就像是一个队 ...
- 用php实现一个双向队列 如何实现?
PHP面试题作业 class DuiLie { private $array = array();//声明空数组 public function setFirst($item){ return arr ...
- 面试题:你能写一个Vue的双向数据绑定吗?
在目前的前端面试中,vue的双向数据绑定已经成为了一个非常容易考到的点,即使不能当场写出来,至少也要能说出原理.本篇文章中我将会仿照vue写一个双向数据绑定的实例,名字就叫myVue吧.结合注释,希望 ...
- deque(双向队列)基本用法
deque(双向队列)基本用法 阅读体验:https://zybuluo.com/Junlier/note/1297030 简单介绍 就是可以两头插元素,两头删元素的数据结构 那么具体的STL操作(只 ...
- C++ Double Ended Queues(双向队列)
双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样). Constructors 创建一个新双向队列 Operators 比较和赋值双向队列 assign() 设置双向队列的值 ...
- 简单介绍python的双向队列
介绍 大家都知道利用 .append 和 .pop 方法,我们可以把列表当作栈或者队列来用(比如,把 append 和 pop(0) 合起来用,就能模拟栈的“先进先出”的特点).但是删除列表的第一个元 ...
- Python_collections_deque双向队列
deque:创建一个双向队列 import collections collections.deque(['nihao','x']) x.append():在列表的右边添加 x.appendleft( ...
随机推荐
- 动态生成的DOM做点击事件无效
有时候我们的标签都是从后台获取的数据,然后利用JS添加到页面上,当我们写生成的标签的点击事件(click)时没有效果. 例如: <section> 测试动态生成的DOM点击事件 <b ...
- 一篇RxJava友好的文章(二)
上一篇文章介绍了rxjava的基本用法,和一些常用的操作符,以及rxjava的链式操作带来的好处.由于rxjava非常的强大,让我如此的痴迷,我打算写五篇文章,专门讲解rxjava 常见的操作符和用法 ...
- Aspects– iOS的AOP面向切面编程的库
简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原 ...
- java乱码问题
我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...
- JNDI整理
JNDI 什么是JNDI JNDI全称为Java Naming and Directory Interface,命名及目录查找接口,是java平台的一种标准扩展,它提供了一系列接口.类和命名空间的概念 ...
- Linux新建用户后的必要设置
系统:ubnutu 18.04 x64 以下操作全在root下 准备工作: 新建用户 useradd -m tom 初始化密码 passwd tom 1. tab按键 不能自动单词不全 # ...
- request中的那些方法到底是干什么的?
最近做Java Web项目,在.jsp页面和servlet之间request和response还是有些混淆,查阅了一些资料,总结如下,方便以后使用: 首先,servlet接口是最基本的,提供的五个方法 ...
- hive_异常_01_(未解决)FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V
一.如果出现如下错误需要编译源码 需要重新编译Hbase-handler源码 步骤如下: 准备Jar包: 将Hbase 中lib下的jar包和Hive中lib下的jar包全部导入到一起. 记得删除里面 ...
- python web框架的介绍
随着互联网的兴起,web开发变得愈发的重要.Python作为当前火热的语言, 其中的web开发框架可以说是百花齐放,下面聊一聊这些框架. 一: 基于Python的代表性Web框架 Django Dja ...
- mybatis在where中比较复杂的判断
<if test="param.applicationStateInNumber != null and param.applicationStateInNumber != ''&qu ...