【队列】先进者先出,这就是典型的“队列”。
        最基本的两个操作:入队enqueue(),放一个数据到队列尾部;出队dequeue(),从队列头部取一个元素。队列可以用数组或者链表实现,用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。
        队列需要两个指针:一个是 head 指针,指向队头;一个是 tail 指针,指向队尾。        
        在数组实现队列的时候,会有数据搬移操作,要想解决数据搬移的问题,我们就需要像环一样的循环队列
        阻塞队列就是在队列为空的时候,从队头取数据会被阻塞,因为此时还没有数据可取,直到队列中有了数据才能返回;如果队列已经满了,那么插入数据的操作就会被阻塞,直到队列中有空闲位置后再插入数据,然后在返回。
        在多线程的情况下,会有多个线程同时操作队列,这时就会存在线程安全问题。能够有效解决线程安全问题的队列就称为并发队列
        基于链表的实现方式,可以实现一个支持无限排队的无界队列(unbounded queue),但是可能会导致过多的请求排队等待,请求处理的响应时间过长。所以,针对响应时间比较敏感的系统,基于链表实现的无限排队的线程池是不合适的。
        而基于数组实现的有界队列(bounded queue),队列的大小有限,所以线程池中排队的请求超过队列大小时,接下来的请求就会被拒绝,这种方式对响应时间敏感的系统来说,就相对更加合理。不过,设置一个合理的队列大小,也是非常有讲究的。队列太大导致等待的请求太多,队列太小会导致无法充分利用系统资源、发挥最大性能。
        实际上,对于大部分资源有限的场景,当没有空闲资源时,基本上都可以通过“队列”这种数据结构来实现请求排队。 
 
  1. <?php
  2.  
  3. /**
  4. * 队列 链表实现
  5. *
  6. * Class QueueOnLinkedList
  7. */
  8. class QueueOnLinkedList
  9. {
  10. /**
  11. * 队列头节点
  12. *
  13. * @var SingleLinkedListNode
  14. */
  15. public $head;
  16.  
  17. /**
  18. * 队列尾节点
  19. *
  20. * @var null
  21. */
  22. public $tail;
  23.  
  24. /**
  25. * 队列长度
  26. *
  27. * @var int
  28. */
  29. public $length;
  30.  
  31. /**
  32. * QueueOnLinkedList constructor.
  33. */
  34. public function __construct()
  35. {
  36. $this->head = new SingleLinkedListNode();
  37. $this->tail = $this->head;
  38.  
  39. $this->length = ;
  40. }
  41.  
  42. /**
  43. * 入队
  44. *
  45. * @param $data
  46. */
  47. public function enqueue($data)
  48. {
  49. $newNode = new SingleLinkedListNode();
  50. $newNode->data = $data;
  51.  
  52. $this->tail->next = $newNode;
  53. $this->tail = $newNode;
  54.  
  55. $this->length++;
  56. }
  57.  
  58. /**
  59. * 出队
  60. *
  61. * @return SingleLinkedListNode|bool|null
  62. */
  63. public function dequeue()
  64. {
  65. if ( == $this->length) {
  66. return false;
  67. }
  68.  
  69. $node = $this->head->next;
  70. $this->head->next = $this->head->next->next;
  71.  
  72. $this->length--;
  73.  
  74. return $node;
  75. }
  76.  
  77. /**
  78. * 获取队列长度
  79. *
  80. * @return int
  81. */
  82. public function getLength()
  83. {
  84. return $this->length;
  85. }
  86.  
  87. /**
  88. * 打印队列
  89. */
  90. public function printSelf()
  91. {
  92. if ( == $this->length) {
  93. echo 'empty queue' . PHP_EOL;
  94. return;
  95. }
  96.  
  97. echo 'head.next -> ';
  98. $curNode = $this->head;
  99. while ($curNode->next) {
  100. echo $curNode->next->data . ' -> ';
  101.  
  102. $curNode = $curNode->next;
  103. }
  104. echo 'NULL' . PHP_EOL;
  105. }
  106. }

调用:

  1. <?php
  2. $queue = new QueueOnLinkedList();
  3. $queue->enqueue();
  4. $queue->enqueue();
  5. $queue->enqueue();
  6. $queue->enqueue();
  7. $queue->enqueue();
  8. $queue->printSelf();
  9. var_dump($queue->getLength());
  10.  
  11. $queue->dequeue();
  12. $queue->printSelf();
  13. $queue->dequeue();
  14. $queue->dequeue();
  15. $queue->dequeue();
  16. $queue->printSelf();
  17.  
  18. $queue->dequeue();
  19. $queue->printSelf();

运行:

算法笔记-PHP实现队列的操作的更多相关文章

  1. 算法笔记-PHP实现栈的操作

    [栈]后进先出,先进后出,这就是典型的“栈”结构.         任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险.      ...

  2. 算法笔记_064:蓝桥杯练习 操作格子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求 ...

  3. 算法笔记_071:SPFA算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 具体编码   1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个 ...

  4. 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)

    Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...

  5. 算法笔记——C/C++语言基础篇(已完结)

    开始系统学习算法,希望自己能够坚持下去,期间会把常用到的算法写进此博客,便于以后复习,同时希望能够给初学者提供一定的帮助,手敲难免存在错误,欢迎评论指正,共同学习.博客也可能会引用别人写的代码,如有引 ...

  6. kNN算法笔记

    kNN算法笔记 标签(空格分隔): 机器学习 kNN是什么 kNN算法是k-NearestNeighbor算法,也就是k邻近算法.是监督学习的一种.所谓监督学习就是有训练数据,训练数据有label标好 ...

  7. 算法<初级> - 第二章 队列、栈、哈希表相关问题

    算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...

  8. CornerNet-Lite算法笔记

    论文名称:CornerNet-Lite: Efficient Keypoint Based Object Detection 论文链接:https://arxiv.org/abs/1904.08900 ...

  9. 《算法笔记》之基础C/C++入门

    开始进行算法笔记的学习,在此纪录下来,同时作为自己日后复习资料. 1.基本语法 #include <iostream> using namespace std; int main(){ c ...

随机推荐

  1. 如何利用office绘制施工进度计划横道图?

    在Excel中利用“悬浮的条形图”可以制作简单的横道图.Step1 启动Excel,仿照图1的格式,制作一份表格,并将有关工序名称.开(完)工时间和工程持续时间等数据填入表格中. A1单元格中请不要输 ...

  2. MySQL设置只读模式

    MySQL设置了主从复制,为保证数据一致性需要在从库设置只读状态 查看默认读写状态 show global variables like "%read_only%"; 设置只读 # ...

  3. poj3613 Cow Relays【好题】【最短路】【快速幂】

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:9207   Accepted: 3604 Descrip ...

  4. 网龙“MAD技术论坛”在榕举办 200余位技术人才共话“改变教育”

    9月16日,由网龙网络公司主办.msup协办的“MAD技术论坛”在榕举办,来自美国.香港.苏州等地的技术大牛受邀来到福州,围绕“Make a difference to education”这一论坛主 ...

  5. LUA 语言易混点

    --代码: tab1 = { key1 = "val1", key2 = "val2","val2", "val3" , ...

  6. POJ 1451 - T9 - [字典树]

    题目链接:http://bailian.openjudge.cn/practice/1451/ 总时间限制: 1000ms 内存限制: 65536kB 描述 Background A while ag ...

  7. POJ 2259 - Team Queue - [队列的邻接表]

    题目链接:http://poj.org/problem?id=2259 Queues and Priority Queues are data structures which are known t ...

  8. [No000013E]用VSCode写python的正确姿势

    最近在学习python,之前一直用notepad++作为编辑器,偶然发现了VScode便被它的颜值吸引.用过之后发现它启动快速,插件丰富,下载安装后几乎不用怎么配置就可以直接使用,而且还支持markd ...

  9. 【实战解析】基于HBase的大数据存储在京东的应用场景

    京东技术 https://mp.weixin.qq.com/s?src=11&timestamp=1551342955&ver=1455&signature=0hYp8OsxY ...

  10. extundelete fuser

    [extundelete ] fuser -mv /dev/sda6 https://blog.csdn.net/xwl145/article/details/38896699 多列排序[sort]h ...