javascript 實現數據結構 - 棧
阿新 • • 發佈:2019-03-18
rip 刪除 emp turn 元素 es6語法 this 數組 items
棧是一種遵從後進先出(LIFO)原則的有序集合。新添加的或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底。在棧裏,新元素都靠近棧頂,舊元素都接近棧底。棧就好像是一個底部密封的盒子,我們往裏面放東西,最先放進去的東西只能再最上面的東西都取出來之後才能取出,也就是所謂的先進後出。
一、采用構造函數法創建棧
function Stack(){ let items = []; //需要一種數據結構來保存棧裏的元素,可以采用數組。 this.push = function (value){//向棧裏添加數據 items.push(value); }; this.pop = function(value){//向棧裏刪除數據 items.pop(value); }; this.peek = function(){//查看棧頂元素 return items[items.length - 1] }; this.isEmpty = function(){ //檢查棧是否為空 return items.length == 0; }; this.size = function(){ //查看棧內元素個數 return items.length; }; this.clear = function(){ //清空棧 items = []; }; this.print = function(){ //檢查棧裏的內容 console.log(items.toString()); }; }; let stack1 = new Stack(); console.log(stack1.isEmpty);//true stack1.push(1); stack1.push(2); stack1.print();//1,2
二.優化 - 如何讓外界無法訪問到items數組,確保棧內數據插入順序不被破壞。
1.引入WeakMap數據類型,WeakMap為Map的弱類型,必須用鍵才可以取出值。這些類沒有entries、keys和values等叠代器方法,因此,除非你知道鍵,否則沒有辦法取出值。
2.閉包。
改寫stack構造函數為
let Stack = (function () { const items = new WeakMap(); const weak = {}; return function(){ items.set(weak, []); this.push = function(value){ let arr = items.get(weak); arr.push(value); }; this.print = function(valule){ let arr = items.get(weak); console.log(arr.toString()); } //... 其它函數 }; })(); let stack1 = new Stack(); stack1.push(1); stack1.push(3); stack1.push(5); stack1.print(); //1,3,5
三. ES6語法書寫棧
let Stack = (function () { const items = new WeakMap(); const weak = {}; class Stack1 { constructor () { items.set(this, []); }; push(value){ let arr = items.get(this); arr.push(value); }; print(){ let arr = items.get(this); console.log(arr.toString); }; //... 其它函數 } return Stack1 })();
javascript 實現數據結構 - 棧