Jtti广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php双向队列实例讲解
  • 189
分享到

php双向队列实例讲解

php双向队列 2018-09-20 10:09:34 189人浏览 无得
摘要

双向队列是指一种具有队列和栈的性质的数据结构。 双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。 双向队列就像是一个队列,但是你可以在任何一端添加或移除元素。 实例 <?PHP class Double

双向队列是指一种具有队列和栈的性质的数据结构

双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

双向队列就像是一个队列,但是你可以在任何一端添加或移除元素。

实例


<?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 
 
 
class DEQue{ // class start 
 
  private $_queue = array(); // 对列 
  private $_maxLength = 0;  // 对列最大长度,0表示不限 
  private $_type = 0;    // 对列类型 
  private $_frontNum = 0;  // 前端插入的数量 
  private $_rearNum = 0;   // 后端插入的数量 
 
 
   
  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); 
  } 
 
 
   
  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; 
  } 
 
   
  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; 
  } 
 
   
  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; 
  } 
 
   
  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; 
  } 
 
   
  public function clear(){ 
    $this->_queue = array(); 
    $this->_frontNum = 0; 
    $this->_rearNum = 0; 
    return true; 
  } 
 
   
  public function isFull(){ 
    $bIsFull = false; 
    if($this->_maxLength!=0 && $this->_maxLength==$this->getLength()){ 
      $bIsFull = true; 
    } 
    return $bIsFull; 
  } 
 
   
  private function getLength(){ 
    return count($this->_queue); 
  } 
 
   
  private function setAddNum($endpoint){ 
    if($this->_type==6){ 
      if($endpoint==1){ 
        $this->_frontNum ++; 
      }else{ 
        $this->_rearNum ++; 
      } 
    } 
  } 
 
   
  private function setRemoveNum($endpoint){ 
    if($this->_type==6){ 
      if($endpoint==1){ 
        $this->_frontNum --; 
      }else{ 
        $this->_rearNum --; 
      } 
    } 
  } 
 
   
  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双向队列如何理解的资料请关注编程界其它相关文章!

--结束END--

本文标题: php双向队列实例讲解

本文链接: https://www.lsjlt.com/news/55.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php双向队列的实例分析
    php双向队列的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。双向队列是指一种具有队列和栈的性质的数据结构。双向队列中的元素可以从两端弹出,其限定插入和...
    401
    2023-10-01
  • 怎么理解php双向队列
    这篇文章主要讲解了“怎么理解php双向队列”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解php双向队列”吧!双向队列是指一种具有队列和栈的性质的数据结构。双向队列中的元素可以从两端弹...
    366
    2023-10-01
  • js的双向绑定实例讲解
    这篇文章主要介绍“js的双向绑定实例讲解”,在日常操作中,相信很多人在js的双向绑定实例讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js的双向绑定实例讲解”的疑惑有所帮...
    241
    2023-10-01
    js
  • 什么是php双向队列
    这篇文章主要讲解了“什么是php双向队列”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是php双向队列”吧!php双向队列是指一种具有队列和栈的性质的数据结构;双向队列中的元素可以从两端...
    259
    2023-10-01
  • laravel使用redis队列实例讲解
    1、队列配置文件是config/queue.php(这里我默认配置即可): 2、 创建迁移表(failed-table 、jobs、migrations) php artis...
    178
    2023-10-01
    laravel使用redis队列 php操作redis队列
  • 运用.NetCore实例讲解RabbitMQ死信队列,延时队列
    目录一、死信队列二、延时队列三、延时消息设置不同过期时间四、延时消息用延时插件的方式实现一、死信队列 描述:Q1队列绑定了x-dead-letter-exchange(死信交换机)...
    392
    2023-10-01
    .NetCore RabbitMQ 死信队列 .NetCore RabbitMQ 延时队列
  • PHP使用Redis队列执行定时任务实例讲解
    Redis类: <?php namespace Utils; use Phalcon\Config\Adapter\Ini as ConfigIni; ...
    758
    2023-10-01
    PHP使用Redis队列 PHP执行定时任务
  • 简单介绍python的双向队列
    介绍   大家都知道利用 .append 和 .pop 方法,我们可以把列表当作栈或者队列来用(比如,把 append 和 pop(0) 合起来用,就能模拟栈的“先进先出”的特点)。但是删除列表的第一个元素(抑或是在第一个元素之前添加一个...
    423
    2023-10-01
    队列 双向 简单
  • Python中什么是双向队列
    今天就跟大家聊聊有关Python中什么是双向队列,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发...
    675
    2023-10-01
  • php微信授权登录实例讲解
    要使用微信授权登录功能需要先在微信开发平台创建应用。然后会获取微信提供给你的appId和AppSecret,然后就可以进行开发了。 当然现有很多大佬封装的微信类库非常齐全,而且还很好...
    686
    2023-10-01
    php微信授权登录 php微信登录
  • C语言超详细讲解栈与队列实现实例
    目录1.思考-12.栈基本操作的实现2.1 初始化栈2.2 入栈2.3 出栈2.4 获取栈顶数据2.5 获取栈中有效元素个数2.6 判断栈是否为空2.7 销毁栈3.测试3.1 测试3...
    933
    2023-10-01
    C语言 栈与队列 C语言 栈 C语言 队列
  • GoLangRabbitMQTTL与死信队列以及延迟队列详细讲解
    目录TTL死信队列延迟队列Go实现延迟队列TTL TTL 全称 Time To Live(存活时间/过期时间)。当消息到达存活时间后,还没有被消费,就会被自动清除。RabbitMQ可...
    236
    2023-10-01
    GoLang RabbitMQ TTL GoLang RabbitMQ死信队列 GoLang RabbitMQ延迟队列
  • php7安装mysqli实例讲解
    本文操作环境:Windows7系统、php-7.1.5、Dell G3。 php7 怎么安装mysqli? centos php7 安装mysqli扩展心得 在新配服务器时发...
    661
    2023-10-01
    php7 mysqli
  • php优化查询foreach代码实例讲解
    php代码优化 应避免在php foreach里面进行sql查询 以下代码示例使用了laravel的操作数据库api,eloquent orm foreach里面执行两次sql查询 ...
    483
    2023-10-01
    php优化查询foreach php中foreach优化
  • PHP中使用ElasticSearch最新实例讲解
    网上很多关于ES的例子都过时了,版本很老,这篇文章的测试环境是ES6.5 通过composer安装 composer require 'elasticsearch/elastic...
    161
    2023-10-01
    PHP中使用ElasticSearch PHP操作ElasticSearch
  • 实例讲解php怎么实现单选功能
    随着互联网信息化的不断发展, 网络应用程序的开发也越来越受到重视。而 PHP 作为目前最流行的 Web 开发语言之一,其实现单选功能的方法也备受关注。在本文中,我们将介绍如何使用 PHP 实现单选功能。单选框简介单选框是一种常见的表单元素,...
    541
    2023-10-01
  • PHP ignore_user_abort()实例讲解
    ignore_user_abort()函数用于设置脚本在客户端断开连接后是否继续执行。当客户端断开连接时,通常情况下脚本会立即终止执...
    379
    2023-10-01
    PHP
  • 消息队列RabbitMQ入门与PHP实例分析
    本篇内容主要讲解“消息队列RabbitMQ入门与PHP实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“消息队列RabbitMQ入门与PHP实例分析”吧!消息队列介绍以及消息队列应用场景Ra...
    909
    2023-10-01
  • Python队列Queue超详细讲解
    目录queue模块简介queue.Queue(maxsize=0)queue.LifoQueue(maxsize=0)queue.PriorityQueue(maxsize=0)qu...
    610
    2023-10-01
    Python队列Queue Python Queue
  • 栈和队列OJ题讲解
    💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是...
    469
    2023-10-01
    数据结构 c语言
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作