一、关于堆和栈的概念及区别

这里参考上篇博客: 浅谈堆和栈的区别
通过这篇文章,我们可以知道广义的堆和栈到底是什么,但是具体在php中的使用呢

二、php中的堆栈

众所周知,PHP提供了一组函数可以用于push与pop(堆栈)还有shift与unshift(队列)来操作数组元素。

1、push与pop

这两个函数操作的是栈,遵循先进后出的原则。就像是往木桶里面加东西一样。通过array_push进行入栈操作,array_pop进行出栈操作。先进栈的部分在木桶的最下面。

(1)array_push()方法

array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。该函数等于多次调用 $array[] = $value。

(2)array_pop()方法

array_pop() 函数删除数组中的最后一个元素。
返回数组的最后一个值。如果数组是空的,或者非数组,将返回 NULL。

(3)实例:

 <?php$arr = array();array_push($arr,'aaa');  //先入栈  aaaarray_push($arr,'bbb');  //后入栈   bbbprint_r($arr);   //此时打印结果为:[0]=>aaa,[1]=>bbb$arr.pop();   //进行出栈操作,先进后出原则,则此时相当于bbb出栈了。print_r($arr);  //打印结果应该是[0]=>aaa
?>

三、php实现的队列

1、什么是队列

首先应该明确,队列和普通的堆栈是不一样的,队列遵循的是“先进先出”。堆栈只能在栈顶删除和插入。队列是每一个新插入的元素都是在队列的尾部插入,每一个要删除的元素都是位于队列的头部,当从队列的头部删除了一个元素后,其它队列中的元素就会向前进1位,在元素移动到队首时,就会接受出队的操作。

队列模型可以理解为排队吃饭。先排队的人就先吃到饭。

2、队列的操作

php中使用array_push()来增加元素,使用array_shift()删除元素。

(1)array_shift()方法

array_shift() 函数删除数组中第一个元素,并返回被删除元素的值。
如果键名是数字的,所有元素都会获得新的键名,从 0 开始,并以 1 递增

具体参考手册:http://www.w3school.com.cn/php/func_array_shift.asp

(2)实例:

<?php$arr = array();array_push($arr,'aaa');  //队列中添加  aaaarray_push($arr,'bbb');  // 队列中添加   bbbprint_r($arr);  //此时打印输出为  [0]=>aaa,[1]=>bbbarray_shift($arr); //删除第一个元素,遵循先进先出原则,删除的是aaaprint_r($arr);  //打印结果为  [0]=>bbb
?>

(3)双端队列

还有一种队列比较特殊,首尾两端都允许进行插入和删除的操作,这种队列可以称为双端队列,与标准的队列不同的就是多了队首的插入操作和队尾的删除操作。一般是通过php的数组函数:array_unshift()和array_shift()。

具体参考:PHP队列原理及基于队列的写文件案例

四、队列的用途

队列可以很好地异步处理数据传送和存储,当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。

end

php中堆和栈的使用相关推荐

  1. 内存中“堆”和“栈”的区别

    内存中"堆"和"栈"的区别: 程序中用来存放数据的内存分为四块,分别是: 1.全局区(静态区)(static):全局变量和静态变量都存储在这块区域,与其他变量的 ...

  2. Java虚拟机:Java中堆和栈的详细区别

    一.Java中内存分配策略: 在比较堆和栈的区别之前,我们先了解下Java的内存分配策略,按照编译原理的观点,程序运行时的内存分配有三种策略,分别是:静态的,栈式的,和堆式的. (1)静态存储分配:是 ...

  3. java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...

    Java中堆.栈和常量池的区别 栈 堆 常量池的概念 首先我们先了解一下概念,Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 栈内存 存放基本类型的变量数据和对象类型的引用(请注意存放的是引 ...

  4. java堆和客栈_java中堆和栈的区别分析

    堆和栈是java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...

  5. C++中堆和栈的完全解析

    C++中堆和栈的完全解析 内存分配方面: 堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并 ...

  6. java堆和客栈_JAVA中堆、栈,静态方法和非静态方法的速度问题

    一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储速度,只知道堆 ...

  7. c语言中栈堆,全程剖析C语言中堆和栈的区别

    C语言中堆和栈的区别 1.申请方式 (1)栈(satck):由系统自动分配.例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间. (2)堆(heap):需程序员自己申请(调用mall ...

  8. Java中堆、栈、常量池等概念解析

    Java中堆.栈.常量池等概念解析 程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器.这是最快的保存区域,因为它位于和其他所有 ...

  9. js 中堆和栈的应用与理解

    js 中堆和栈的应用与理解 定义 堆内存: 栈内存: 堆和栈在js中的应用 栈: 堆内存 堆和栈有两种 一种是说的数据结构-堆,堆栈 一种是说的内存-堆内存,栈内存 我今天要说的就是堆内存和栈内存 定 ...

  10. JAVA中堆和栈的区别和联系

    一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于储存实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. 栈 ...

最新文章

  1. RapidJSON简介及使用
  2. java 文本编辑器替换特殊字符_linux中批量替换文本中字符串--转载
  3. The APR based Apache Tomcat Native library
  4. 第五百八十天 how can I 坚持
  5. [云炬创业基础笔记]第十章企业的利润计划测试3
  6. h5 bootstrap 小程序模板_一道面试题小程序与H5的区别
  7. 华为开源构建工具_为什么我构建了用于大数据测试和质量控制的开源工具
  8. ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)
  9. PHP超全局变量$_SERVER
  10. JDK源码解析之 Java.lang.StringBuilder
  11. Python中NotImplementedError的使用方法(抽象类集成子类实现)
  12. 用 Python 编写一个天气查询应用 pyqt5
  13. 用虚拟 router 连通 subnet - 每天5分钟玩转 OpenStack(141)
  14. 【英语学习】【WOTD】horticulture 释义/词源/示例
  15. c语言利用线程交替打印奇偶数,两个线程交替打印奇偶数
  16. WPF4文字模糊不清晰、边框线条粗细不一致的解决方法
  17. 有哪些相见恨晚的运动常识
  18. Windows Server AppFabric正式发布
  19. Labview波形图 波形图表 XY图
  20. SIP协议详解(中文)-5

热门文章

  1. python list学习笔记
  2. MediaSource 缓存
  3. Java OpenCV-4.0.0 图像处理22 图像模板匹配
  4. ElasticSearch 条件更新 删除
  5. python Sigmoid和Tanh 可视化
  6. pycuda write complex numbers — errors:class “cuComplex” has no member “i”
  7. 运动检测(前景检测)之——ViBe
  8. sys/cdefs.h: No such file or directory
  9. Cissp-【第1章 安全和风险管理】-2020-12-31(86页-98页)
  10. 八、redis性能测试