堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象数据类型,
只允许在有序的线性数据集合的一端(称为堆栈顶端,英语:top)
进行加入数据(英语:push)
和移除数据(英语:pop)的运算。
因而按照后进先出(LIFO, Last In First Out)的原理运作。

解释

以上是 维基百科 关于栈的描述,转换为人话就是大概这么几条:

  • 先入后出的数据结构
  • 根据 sp 栈指针进行操作数据
  • 两个异常

    • Stack Overflow 栈溢出 (前端同学是不是对这个单词很熟悉)

      • 栈中元素个数已经等于栈的最大容量 再往里面放元素 会报错此错误
    • Stack Underflow 栈下溢

      • 栈是空的 再从里面取元素 会报错此错误
  • 来自维基百科的栈的示意图:

image.png

也就是说,对于栈,先进去的数据最后出来。记得之前看过一篇关于栈的描述。 感觉特别形象 一下就记住了栈这个数据结构:

栈就像一个羽毛球桶,先放进去的羽毛球在下面,后放进去的羽毛球在上面。
那么当从桶中取羽毛球的时候,
上面的羽毛球肯定是先取出,下面的羽毛球最后取出。

image.png

JS实现一个栈结构
class Stack {
  constructor(max = 10000) {
    this.max = max; // 栈最大值
    this.sp = -1; // 初始化指针
    this.data = new Array(max); // 初始化栈空间
  }

  // 放数据
  push(item) {
    if (this.sp >= this.max - 1) {
      // 栈溢出
      throw new Error("Stack Overflow!");
    }
    this.data[++this.sp] = item; // 1.  依次放数据 2. 指针sp+1
  }

  // 取数据
  pop() {
    if (this.sp < 0) {
      // 栈下溢
      throw new Error("Stack UnderFlow!");
    }
    return this.data[this.sp--]; // 1. 取最后一条数据 2.指针-1
  }
}
测试一下
p.push(1);
p.push(2);
p.push(3);

console.log(p.pop(), p);
// 3 Stack { max: 10000, sp: 1, data: [ 1, 2, 3, <9997 empty items> ] }

可以看到,取出了p中最后一个元素 3 ,并且此时栈的指针指向了第二个元素 2。即, JS实现了简单的栈结构。


Funky_Tiger
443 声望33 粉丝

刷题,交流,offer,内推,涨薪,相亲,前端资源共享...