对程序员来说栈结构最为熟悉的一种数据结构,其特点是遵从后进先出(LIFO——Last In First Out)原则,新添加或待删除的元素保存在栈的同一端,称作栈顶,另一端称作栈底。在栈中,新元素总是靠近栈顶,而旧元素总是接近栈底。
js实现栈数据结构也相对简单
es5实现栈结构
/**
* stack类
* */
function Stack() {
this.items = [];
}
Stack.prototype={
// 向栈添加新元素
push : function (element) {
this.items.push(element);
},
// 从栈内弹出一个元素
pop : function () {
return this.items.pop();
},
// 返回栈顶的元素
peek : function () {
return this.items[this.items.length - 1];
},
// 判断栈是否为空
isEmpty : function () {
return this.items.length === 0;
},
// 返回栈的长度
size : function () {
return this.items.length;
},
// 清空栈
clear : function () {
this.items = [];
},
// 打印栈内的所有元素
print : function () {
console.log(this.items.toString());
}
}
测试:
//------------------测试-----------------
let stack = new Stack();
console.log(stack.isEmpty()); // true
//测试数组
let testArry = [1,2,3,4,5]
//入栈
testArry.forEach(v=>{
stack.push(v);
})
console.log(stack.isEmpty()); // false
stack.print();
console.log(stack.peek()); // 5
console.log(stack.size()); // 5
stack.pop();
console.log(stack.size()); // 4
stack.print(); //1,2,3,4
stack.clear();
console.log(stack.size()); // 0
stack.print();
结果:
es6实现:
let Stack = (function () {
const items = new WeakMap();
class Stack {
constructor () {
items.set(this, []);
}
push(element) {
let s = items.get(this);
s.push(element);
}
pop() {
let s = items.get(this);
return s.pop();
}
peek() {
let s = items.get(this);
return s[s.length - 1];
}
isEmpty() {
return items.get(this).length === 0;
}
size() {
return items.get(this).length;
}
clear() {
items.set(this, []);
}
print() {
console.log(items.get(this).toString());
}
}
return Stack;
})();