栈的简介
栈是什么?栈是一个后进先出(LIFO)的数据结构。栈有啥作用?栈可以模拟算法或生活中的一些后进先出的场景,比如:
- 十进制转二进制,你需要将余数倒序输出。
- 二叉树的先中后序非递归遍历都用到了栈。
- 在生活中,栈可以模拟煤炉与蜂窝煤等场景。
用 JavaScript 写一个栈类 对于 JavaScript 工程师来说,没必要在开发中实现一个栈。因为 JavaScript 的内置对象 Array 已经实现了栈的相关方法。不过,好的程序员不能光用别人设计好的方法,而不理解为啥这么设计,所以我们还是自己设计一个栈玩玩吧!
function Stack(){
...
}
module.exports = Stack;
私有变量
栈类的私有变量是个数组 items,用于记录栈的元素。栈类实例化生成的对象不能直接操作 items,因为 items 在函数外面是不可见的,你只能通过一些类方法沿着作用域链来间接操作 items。
function Stack() {
// 私有变量 items,用于记录数组,对象不能直接操作
var items = [];
}
实现 push 、pop和 toString 方法 实现 push 、pop 和 toString 方法,跑通如下测试:
// 实例化一个 stack 对象
const stack = new Stack();
// 期望 stack 为空
expect(stack.isEmpty()).toBeTruthy()
stack.push(4)
stack.push(7)
// 期望 stack 删除并返回的是7
expect(stack.pop()).toBe(7)
// 期望 stack 转化成字符串'4'
expect(stack.toString()).toBe('4')
push 、pop 和 toString 方法 与 Array 自带的 push 、pop 和 toString 方法一样,所以实现代码如下:
function Stack() {
// 私有变量 items 用于记录数组, 不能直接操作
let items = [];
// 类方法 push, 在数组末尾添加元素, 可以直接调用
this.push = function (element) {
items.push(element);
}
// 删除并返回数组末尾的元素
this.pop = function (element) {
return items.pop()
}
// 将数组转为字符串并返回
this.toString = function () {
return items.toString()
}
}
实现 peek 、isEmpty、clear、size 方法 实现 peek 、isEmpty、clear、size 方法,跑通如下测试
stack.push(6)
// 期望 stack 最后一个元素是6
expect(stack.peek()).toBe(6)
// 期望 stack 的长度为2
expect(stack.size()).toBe(2)
// 期望 stack 不为空
expect(stack.isEmpty()).toBeFalsy()
stack.clear()
// 期望 stack 长度为0
expect(stack.size()).toBe(0)
上述方法比较简单,直接上代码:
function Stack() {
// 私有变量 items,用于记录数组,对象不能直接操作
var items = [];
// 查看数组最后一项
this.peek = function () {
return items[items.length - 1];
};
// 判断数组是否为空
this.isEmpty = function () {
return items.length == 0;
};
// 清空数组
this.clear = function () {
items = [];
};
// 返回数组长度
this.size = function () {
return items.length;
};
}