栈(stack)

当我们在学习中遇到栈这个名词时,我们可能面临的是不同的含义。如果没有理清这些不同的场景,会给我们的理解带来困惑。

一种场景栈是一种数据结构。它表达的是对于数据的一种存取方式。这是一种理论基础。

另外一种场景是用来规定代码的执行顺序,在JavaScript中我们叫做函数调用栈(call stack),它是根据栈数据结构的理论而实现的一种实践。理解函数调用栈的概念非常重要,我们会在后续的章节里详细说明。

还有一种场景表达的是一种数据在内存中的存储区域。通常叫做栈区。但是JavaScript作为一门高级程序语言,并没有如同其他语言那样区分栈区域堆区,因此这里就不扩展开来理解。我们可以简单粗暴的认为在JavaScript中,所有的数据都是存放在堆内存空间中。

这里我们需要重点掌握栈这种数据结构的原理与特点。学习它的最终目的是要掌握函数调用栈的运行方式。

要简单理解栈的存取方式,我们可以通过类比乒乓球盒子来分析。如下图所示。

往乒乓球盒子中依次放入乒乓球,当我们想要取出来使用的时候,处于盒子中最顶层的乒乓球5,它一定是最后被放进去并且最先被取出来的。而我们想要使用最底层的乒乓球1,就必须要将上面的所有乒乓球取出来之后才能取出。但乒乓球1是最先放入盒子的。

这种乒乓球的存取方式与栈数据结构如出一辙。这种存取方式的特点我们总结为先进后出,后进先出(LIFO,Last In,First Out)。如上图右侧所示,处于栈顶的数据 true,最后进栈,最先出栈。处于栈底的数据 1,最先进栈,最后出栈。

在JavaScript中,数组(Array)提供了两个栈方法用来对应栈的这种存取方式。他们在实践中非常常用。

push :向数组末尾中添加元素。(进栈方法)

push方法可以接收任意参数,并把他们逐个添加到数组末尾,并返回修改后数组的长度。

var a = [];
a.push(1);         // a: [1]
a.push(2, 4, 6);   // a: [1, 2, 4, 6]
var l = a.push(5); // a: [1, 2, 4, 6, 5] l: 5

pop:弹出数据最末尾的一个元素。(出栈方法)

pop方法会将数据最末尾的一个元素删除,并返回被删除的元素。

var a = [1, 2, 3];
a.pop(); // a: [1, 2]

// a.pop()的返回结果为 3

results matching ""

    No results matching ""