對程序員來說棧結構最爲熟悉的一種數據結構,其特點是遵從後進先出(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;
})();