返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php中的栈是什么
  • 753
分享到

php中的栈是什么

2023-06-20 17:06:17 753人浏览 安东尼
摘要

本篇内容主要讲解“PHP中的栈是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中的栈是什么”吧!对于逻辑结构来说,我们也是从最简单的开始。堆栈、队列,这两个词对于大部分人都不会陌生,但

本篇内容主要讲解“PHP中的栈是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习php中的栈是什么”吧!

对于逻辑结构来说,我们也是从最简单的开始。堆栈、队列,这两个词对于大部分人都不会陌生,但是,堆和栈其实是两个东西。在面试的时候千万不要被面试官绕晕了。堆是一种树结构,或者说是完全二叉树的结构。而今天,我们主要讲的就是这个栈的应用。

什么是栈?

栈一般就是一种顺序的数据结构。它最大的特点就是后进先出(LIFO),或者反过来说先进后出(FILO)也是可以的。这两句话到底是什么意思呢?最典型的例子就是大家看电视剧时,特别是枪战片时绝对会看到的一样东西:弹匣。

弹匣在装弹的时候都是一个一个的将子弹压进弹匣的,也就是说,第一颗子弹是被压在最底下的,而开枪的时候则是按相反的顺序从弹匣的最顶部弹出来的,第一颗放进去的子弹是最后一个才被打出来的。

这个例子其实已经非常形象了,我们再统一一下术语。将子弹压进弹匣叫做“入栈”,第一颗子弹在最底下,这个位置叫做“栈底”,最后一颗子弹在最顶上,这个位置叫做“栈顶”,打出的这颗子弹是“栈顶”的那颗子弹,这个操作叫做“出栈”。

通过上面术语的定义,我们就可以看出,栈的逻辑操作主要就是“入栈”和“出栈”,而逻辑结构最需要关心的是这个“栈顶”和“栈底”在进行出入栈时的状态。当然,栈的逻辑结构使用顺序或链式结构都是没有问题的,我们就一个一个地来看一下。

顺序栈

首先还是比较简单的顺序栈的实现。既然是顺序结构,那么就是用数组了。不过,我们还需要记录一下“栈顶”或“栈底”的情况,所以我们将顺序栈的这个数组封装到一个类中。

同时,在这个类中定义一个属性来标明当前栈的“栈顶”或“栈底”指针,其实就是当前“栈顶”或“栈底”在数组中的下标位置。通常来说,我们只需要记录“栈顶”的位置就可以了,将“栈底”默认为 -1 即可。因为数组下标本身是从 0 开始的,所以当“栈顶”属性为 -1 时,这个栈就是一个空栈,因为它的“栈顶”和“栈底”在一起,里面并没有元素。

class SqStack{    public $data;    public $top;}

初始化顺序栈很简单,一个空的数组并将 $top 设置为 -1 。

function InitSqStack(){    $stack = new SqStack();    $stack->data = [];    $stack->top = -1;    return $stack;}

接下来就是“入栈”和“出栈”的操作了,先看代码。

function PushSqStack(SqStack &$stack, $x){    $stack->top ++;    $stack->data[$stack->top] = $x;}function PopSqStack(SqStack &$stack){    // 栈空    if($stack->top == -1){        return false;    }    $v = $stack->data[$stack->top];    $stack->top--;    return $v;}

入栈很简单,给数组元素添加内容,然后 $top++ 就可以了。不过如果是 C 语言的话,因为它有数组长度的限制,所以在入栈的时候,我们也需要判断一下栈是否已经满了。当然,在 PHP 中我们就没有这个顾虑啦。

顺序栈入栈图示

php中的栈是什么

出栈的时候需要判断当前的栈是否已经空了,这个就不区分什么语言了,因为要是比 -1 还小的话,再次使用这个栈就会出现问题了。在出栈的时候如果栈已经空了就不要再给 $top-- 了,然后获取栈顶元素并返回就可以了。

顺序栈出栈图示

php中的栈是什么

我们来看一下这个顺序栈的测试结果。

$stack = InitSqStack();PushSqStack($stack, 'a');PushSqStack($stack, 'b');PushSqStack($stack, 'c');var_dump($stack);// object(SqStack)#1 (2) {//     ["data"]=>//     array(3) {//       [0]=>//       string(1) "a"//       [1]=>//       string(1) "b"//       [2]=>//       string(1) "c"//     }//     ["top"]=>//     int(2)//   }echo PopSqStack($stack), PHP_EOL; // cecho PopSqStack($stack), PHP_EOL; // becho PopSqStack($stack), PHP_EOL; // avar_dump($stack);// object(SqStack)#1 (2) {//     ["data"]=>//     array(3) {//       [0]=>//       string(1) "a"//       [1]=>//       string(1) "b"//       [2]=>//       string(1) "c"//     }//     ["top"]=>//     int(-1)//   }

通过数组来操作栈是不是非常地简单。看完学习完链栈之后,我们还会讲到 PHP 已经为我们准备好的数组栈的操作函数哦,使用起来会更加的方便。

链栈

其实对于链式存储结构来说,核心的内容还是一样的,同样是要关心我们的栈顶,也同样要关心出入栈的操作。但是,在链式中,我们可以使有头插法,也就是让插入的数据保持在链的顶端来实现“栈顶”的效果。这样,我们就不需要一个专门的属性来保存当前的栈顶位置了。直接通过一个图来理解会更清晰。

php中的栈是什么

class LinkStack{    public $data;    public $next;}

数据的结构就是一个典型的链式结构就可以了,主要还是看出入栈的操作是如何进行的。

function InitLinkStack(){    return null;}function PushLinkStack(?LinkStack &$stack, $x){    $s = new LinkStack();    $s->data = $x;    $s->next = $stack;    $stack = $s;}function PopLinkStack(?LinkStack &$stack){    if($stack == NULL){        return false;    }    $v = $stack->data;    $stack = $stack->next;    return $v;}

在链栈中其实初始化空栈的操作意义不大。我们可以直接定义一个 null 变量然后针对它进行链式操作就可以了,但在这里我们还是与顺序栈保持统一。就像顺序栈中的栈底为 -1 一样,在链栈中,我们也约定好栈底为一个 null 对象节点。

接下来就是入栈操作了。这里我们使用的是头插法,其实就是将新元素放到链表的顶端。先实例化一个节点,然后将这个节点的 next 指向链表的头节点。接着再让当前这个节点成为链表的新的头节点,就像下图所示的那样。

php中的栈是什么

同理,出栈的操作其实也是类似的,将头节点变成当前头节点的 next 节点,直到当前节点变成 null ,也就是栈已经空了,如图所示:

php中的栈是什么

最后,我们同样的测试一下这一套链式栈的代码运行情况如何。

$stack = InitLinkStack();PushLinkStack($stack, 'a');PushLinkStack($stack, 'b');PushLinkStack($stack, 'c');var_dump($stack);// object(LinkStack)#3 (2) {//     ["data"]=>//     string(1) "c"//     ["next"]=>//     object(LinkStack)#2 (2) {//       ["data"]=>//       string(1) "b"//       ["next"]=>//       object(LinkStack)#1 (2) {//         ["data"]=>//         string(1) "a"//         ["next"]=>//         NULL//       }//     }//   }echo PopLinkStack($stack), PHP_EOL; // cecho PopLinkStack($stack), PHP_EOL; // becho PopLinkStack($stack), PHP_EOL; // avar_dump($stack);// NULL

是不是很多小伙伴已经看出之前我们花费了 4 篇文章的时间来讲述线性结构中的顺序表和链表的重要作用了吧。它们真的是一切其它逻辑结构的基础。不光是栈,在队列、树、图中我们都会有不同结构的线性和链式的实现。当然,更重要的是能体会它们之间的区别,在不同的业务场景中,两种不同的存储结构可能真的会带来完全不一样的体验。

PHP 为我们提供的数组栈操作

最后,我们简单的看一下在 PHP 中已经为我们准备好的两个数组操作函数。有了它们,对于顺序栈来说,我们的操作可以简化到非常傻瓜智能的效果。

$sqStackList = [];array_push($sqStackList, 'a');array_push($sqStackList, 'b');array_push($sqStackList, 'c');print_r($sqStackList);// Array// (//     [0] => a//     [1] => b//     [2] => c// )array_pop($sqStackList);print_r($sqStackList);// Array// (//     [0] => a//     [1] => b// )echo count($sqStackList) > 0 ? $sqStackList[count($sqStackList) - 1] : false, PHP_EOL;// barray_pop($sqStackList);echo count($sqStackList) > 0 ? $sqStackList[count($sqStackList) - 1] : false, PHP_EOL;// carray_pop($sqStackList);print_r($sqStackList);// Array// (// )

估计不少同学早就用过这两个函数了。array_push() 就是向数组中压入一个数据,其实说白了,增加一个数据到数组中而已,没什么特别稀罕的功能。而 array_pop() 则是将数组最后一个位置的数据弹出。是不是和我们上面自己实现的那个顺序栈是完全相同的概念。没错,既然语言环境已经为我们准备好了,那么除了在某些场景下需要链式结构的话,大部分情况下我们直接使用这两个函数就可以方便地实现 PHP 中的栈操作了。

总结

栈这个逻辑结构是不是非常的简单清晰呀,在日常应用中其实栈的使用非常广泛。比如算式中的前缀算式、中缀算式、后缀算式的转化,比如我们后面学习树、图时要接触到了BFS(深度搜索),再根据BFS引出递归这个概念。另外,在解析字符时的一些对称匹配、回文算法的判断等等,这些都是栈的典型应用。可以说,栈这个东西撑起了计算机算法的半壁江山。而另外半壁呢?当然就是我们下回要讲的:队列。

测试代码:

https://GitHub.com/zhangyue0503/Data-structure-and-alGorithm/blob/master/3.栈和队列/source/3.1栈的相关逻辑操作.php

到此,相信大家对“php中的栈是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: php中的栈是什么

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

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

猜你喜欢
  • php中的栈是什么
    本篇内容主要讲解“php中的栈是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中的栈是什么”吧!对于逻辑结构来说,我们也是从最简单的开始。堆栈、队列,这两个词对于大部分人都不会陌生,但...
    99+
    2023-06-20
  • 在web开发中的栈是什么
    本篇文章给大家分享的是有关在web开发中的栈是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 什么是栈栈在我们日常编码中遇到的非...
    99+
    2024-04-02
  • java什么是栈
    系统中的堆、栈和数据结构堆、栈不是一个概念。可以说系统中的堆、栈是真实的内存物理区,数据结构中的堆、栈是抽象的数据存储结构。栈:实际上就是满足后进先出的性质,是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和...
    99+
    2019-04-11
    java入门 java
  • linux栈指的是什么
    今天小编给大家分享一下linux栈指的是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在linux中,栈是一种串列形式的...
    99+
    2023-07-02
  • windows中链栈和顺序栈相比的优势是什么
    本篇内容介绍了“windows中链栈和顺序栈相比的优势是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!和顺序栈相比,链栈的优势是:通常不...
    99+
    2023-06-25
  • java中栈和堆的区别是什么
    Java栈Java 栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的Java栈,在这个Java栈中又会含有多个栈,这些栈帧是与每个方法关联起来的,每个运行一个方法就创建一个栈帧会含有一些“内部变量"(在方法内定...
    99+
    2019-01-17
    java入门 java 区别
  • Java中栈的线性结构是什么
    这期内容当中小编将会给大家带来有关Java中栈的线性结构是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一:栈栈是限制插入和删除只能在一个位置上进行的表,此位置就是表的末端,叫作栈顶。栈的基本操作分为...
    99+
    2023-06-20
  • Python全栈中的JS对象是什么
    这篇文章主要为大家分析了Python全栈中的JS对象是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Python全栈中的JS对象是什么”的知识吧。1. ...
    99+
    2023-06-28
  • linux的协议栈是什么
    这篇“linux的协议栈是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux的协议栈是什么”文章吧。在linux中...
    99+
    2023-07-02
  • java中栈和队列的区别是什么?
    队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表;栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表。区别如下:一、规则不同队列:先进先出(First In First Out)FIFO栈:先进后...
    99+
    2021-02-23
    java教程 java 队列
  • Linux中进程内核栈是什么
    这篇文章主要介绍了Linux中进程内核栈是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是进程的“内核栈”?在每一个进程的生命周期中,必然会通过到系统调用陷入内核。在...
    99+
    2023-06-12
  • 堆和栈的区别是什么
    堆和栈的区别是:1、栈是一种线性数据结构,而堆则是一种树状的数据结构;2、栈的内存分配方式是自动的,而堆的内存分配与释放需要手动管理;3、栈的内存分配速度相对较快,而堆的内存分配速度较慢;4、栈的大小是固定的,而堆的大小可以根据需要进行动态...
    99+
    2023-08-10
  • 压栈是什么意思
    ...
    99+
    2023-10-29
  • 找出栈中最小值的方法是什么
    本篇内容介绍了“找出栈中最小值的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!题目定义栈的数据结...
    99+
    2024-04-02
  • 计算机网络中什么是堆栈
    小编给大家分享一下计算机网络中什么是堆栈,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!堆栈都是一种数据项按序排列的数据结构,只能在一端【称为栈顶(top)】对数据...
    99+
    2023-06-14
  • java全栈指的是什么意思
    这篇文章给大家分享的是有关java全栈指的是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布...
    99+
    2023-06-14
  • python全栈指的是什么意思
    小编给大家分享一下python全栈指的是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python主要应用领域有哪些1、云计算,典型应用OpenStack...
    99+
    2023-06-14
  • python全栈开发指的是什么
    这篇文章主要介绍python全栈开发指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pillow;4.twisted...
    99+
    2023-06-14
  • java堆栈存放的数据是什么
    Java堆栈存放的数据主要是方法的调用和局部变量。当一个方法被调用时,会在堆栈上创建一个方法帧(Method Frame),用于存放...
    99+
    2023-10-10
    java
  • java最常用的技术栈是什么
    这篇文章主要介绍“java最常用的技术栈是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java最常用的技术栈是什么”文章能帮助大家解决问题。java常用的技术栈有:1、JDK;2、Web框架;...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作