栈,数据结构的一种,它遵循后进先出(Last in, First out,LIFO)的原则。
把 栈 比喻成一个类似乒乓球桶的容器比较容易理解,桶的底部是封口的,顶部是开口的,桶的横切面刚好容纳一个乒乓球的直径,也就是放入第一个乒乓球后,再放第二个乒乓球势必压在第一个球的正上方。
- 最先入栈的 球1 在乒乓球桶的最底部(栈底)。
- 最后入栈的 球4 在乒乓球桶的最顶部(栈顶)。
- 球4 入栈后,若要从栈中取乒乓球,最先取到的一定是 球4。
- 要从栈中取到 球1,需要先取出 球1 上面的所有球,最后才能取到 球1。
JavaScript 中的函数调用栈就是栈数据结构,在此不过多讨论。现在我们要用模拟实现一个栈数据结构。
分析
- 使用面向对象实现,首先需要写一个
Stack
构造函数。 Stack
内部需要有个数组items
存储栈中所有元素。- 需要有个往栈中新增元素的方法
push
。 - 还要有个移除元素的方法,因为移除元素一定是最顶端的元素,对应数组的
pop
方法,所以同样取名pop
。
编写 Stack
构造函数:
function Stack(){
this.items = [];
}
添加 push
方法:
Stack.prototype.push = function(item){
this.items.push(item);
}
添加 pop
方法:
Stack.prototype.pop = function(){
this.items.pop();
}
可以给 Stack
类添加一些常用方法,比如:
查看栈顶元素的 getTop
方法:
Stack.prototype.getTop = function(){
return this.items[this.items.length-1];
}
查看栈元素个数的 size
方法:
Stack.prototype.size = function(){
return this.items.length;
}
清空栈的 clear
方法:
Stack.prototype.clear = function(){
this.items = [];
}
打印栈的 print
方法:
Stack.prototype.print = function(){
console.log(JSON.stringify(this.items));
}
完整代码:
function Stack(limit){
this.items = [];
}
Stack.prototype.push = function(item){
this.items.push(item);
}
Stack.prototype.pop = function(){
this.items.pop();
}
Stack.prototype.getTop = function(){
return this.items[this.items.length-1];
}
Stack.prototype.size = function(){
return this.items.length;
}
Stack.prototype.clear = function(){
this.items = [];
}
Stack.prototype.print = function(){
console.log(JSON.stringify(this.items));
}
创建实例并测试
var stack = new Stack();
// 插入一些元素
stack.push('a');
stack.push('b');
stack.push('c');
// 查看栈元素个数
console.log(stack.size()); // 3
// 获取栈顶元素
console.log(stack.getTop()); // "c"
// 打印
stack.print(); // ["a","b","c"]
// 让栈顶元素出栈
stack.pop();
// 查看栈元素个数
console.log(stack.size()); // 2
// 获取栈顶元素
console.log(stack.getTop()); // "b"
// 打印
stack.print(); // ["a","b"]
至此,模拟实现栈的代码测试完毕。