堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象数据类型,
只允许在有序的线性数据集合的一端(称为堆栈顶端,英语:top)
进行加入数据(英语:push)
和移除数据(英语:pop)的运算。
因而按照后进先出(LIFO, Last In First Out)的原理运作。
解释
以上是 维基百科 关于栈的描述,转换为人话就是大概这么几条:
-
先入后出
的数据结构 - 根据
sp
栈指针进行操作数据 -
两个异常
-
Stack Overflow
栈溢出 (前端同学是不是对这个单词很熟悉)- 栈中元素个数已经等于栈的最大容量 再往里面放元素 会报错此错误
-
Stack Underflow
栈下溢- 栈是空的 再从里面取元素 会报错此错误
-
- 来自
维基百科
的栈的示意图:
也就是说,对于栈,先进去的数据最后出来。记得之前看过一篇关于栈的描述。 感觉特别形象 一下就记住了栈这个数据结构:
栈就像一个羽毛球桶,先放进去的羽毛球在下面,后放进去的羽毛球在上面。
那么当从桶中取羽毛球的时候,
上面的羽毛球肯定是先取出,下面的羽毛球最后取出。
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实现了简单的栈结构。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。