栈是一种遵从后进先出原则的有序集合。新添加的或待删除的元素都保存在栈的同一端,称作栈顶,另一端叫做栈底。
栈也被用在编程语言的编译器和内存中保存变量,方法调用等。
ES5实现
function Stack(){
let items = [];
// 向栈添加元素
this.push = function(ele){
items.push(ele);
}
// 从栈移出元素
this.pop = function(){
return items.pop();
}
// 查看栈顶元素
this.peek = function(){
return items[items.length-1];
}
// 检查栈是否为空
this.isEmpty = function(){
return items.length == 0;
}
// 清空栈
this.clear = function(){
items = [];
}
// 打印栈元素
this.print = function(){
console.log(items.toString());
}
}
测试:
let stack = new Stack();
console.log(stack.isEmpty()); //ture
stack.push(1);
stack.push(2);
stack.print(); //1,2
ES6实现
const items = new WeakMap(); //WeakMap数据类型可以确保属性是私有的,用WeakMap来存储items变量
class Stack{
constructor(){
items.set(this, []); //以this(Stack类自己的引用)为键,把代表栈的数组存入items
}
// 向栈添加元素
push(ele){
let s = items.get(this);
s.push(ele);
}
// 从栈移出元素
pop(){
let s = items.get(this);
console.log(s.pop());
}
// 查看栈顶元素
peek(){
let s = items.get(this);
console.log(s[s.length-1]);
}
// 检查栈是否为空
isEmpty(){
let s = items.get(this);
if(s.length == 0){
console.log('空');
}else{
console.log('不空');
}
}
// 清空栈
clear(){
let s = items.get(this);
for(var i = 0; i<s.length;i++){
s.pop(s[i])
}
console.log('栈已清空')
}
// 打印栈
print(){
let s = items.get(this);
console.log(s.toString());
}
}
测试:
let stack = new Stack();
stack.isEmpty(); //空
stack.push(1);
stack.push(2);
stack.isEmpty(); //不空
stack.print(); //1,2
stack.peek(); //2
stack.pop(); //2
stack.clear(); //栈已清空
stack.isEmpty(); //空
stack.print();