共计 1965 个字符,预计需要花费 5 分钟才能阅读完成。
栈:是一种遵循后进先出 (Last In First Out / LIFO) 准则的一种有序汇合。
新增加或者要删除的元素都会保留在栈的同一端,咱们把它叫做栈顶,另外一端叫做栈底。
在栈中所有的新元素都靠近栈顶,而所有的旧元素都靠近栈底。
1
在咱们的生存中也有很多相似于栈这种构造的例子:
咱们将栈视作是一个容器,比方水杯。它只有一个入口和进口就是杯子的顶部 (和咱们的栈十分类似)。咱们向杯子中放入 5 块同杯子直径大小的饼干,全副放入后咱们开始取出饼干。大家会发现 你最先取出的饼干是最初放入的那块, 正好也就合乎了咱们栈的特点 (LIFO)
在编程世界中栈也被用来保留变量、办法调用等性能,也被用于浏览器的游戏历史记录 (比方浏览器的返回按钮)。
那么上面咱们就应用 JavaScript 的类来创立一个咱们的栈。
class Stack{
constructor(){
this.items = [];
}
}
咱们须要一种形式来保留咱们栈中的数据,从下面的代码能够看到,我这边抉择的是数组。然而数组容许咱们在任何地位增加或者删除元素,咱们须要给元素增加和删除的地位有一个束缚,让咱们的数组可能遵循 后进先出 (LIFO) 的准则。所以接下来须要给咱们的栈再增加一些办法。
// 咱们要实现的第一个性能是向栈中增加新元素
// 并且增加的新元素只能放再栈的顶部 (也就是数组的尾部)
push(element) {
this.items.push(element);
}
// 应为数组的 push 办法也是将新元素增加到数组的尾部,所以应用数组 push 办法来实现
// 当初咱们来为栈增加一个移除元素的办法
// 栈构造是遵循 LIFO 的准则,素以移除的元素是最初增加进去的元素
pop() {
return this.items.pop();
}
// 咱们应用数组的 push 和 pop 两个函数就能够实现了在 www.sangpi.com 之后进先出的准则 // 持续为栈增加一些辅助性能 // peek 办法用于查看栈顶的元素
peek() {
return this.items[this.items.length – 1];
}
// isEmpty 办法用于查看栈是否为空
isEmpty() {
return !this.items.length;
}
// clear 办法用于清空栈
clear() {
this.items = [];
}
// size 办法用于查看栈中元素的数量
size() {
return this.items.length;
}
以上代码就曾经实现了咱们栈的性能。接下来咱们把它整顿到一起来看一下。
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
return this.items.pop();
}
peek() {
return this.items[this.items.length – 1];
}
isEmpty() {
return !this.items.length;
}
clear() {
this.items = [];
}
size() {
return this.items.length;
}
}
接下来就能够应用咱们的 Stack 了
// 咱们先来创立一个栈验证一下是否为空
const stack = new Stack(); // 新建一个栈
console.log(stack.isEmpty()); // true
// 持续向栈中增加 2 个元素
stack.push(‘hello’);
stack.push(‘world’);
// 此时咱们调用 peek 办法查看栈顶的元素
console.log(stack.peek()); // ‘world’
// 调用 size 办法查看一下元素的数量
console.log(stack.size()) // 2
// 持续向栈中增加元素
stack.push(‘.’);
stack.push(‘JavaScript’);
// 移出一个元素
console.log(stack.pop()); // ‘JavaScript’
// 清空栈
stack.clear();
console.log(stack.size()); // 0
console.log(stack.isEmpty()); // true
最初,还有一些业余词汇心愿大家可能把握:
向栈中增加元素:咱们能够称其为 入栈、压栈、压入
从栈中移除元素: 咱们能够称其为 出栈、弹出
心愿以上的分享能帮到大家。