棧資料結構
棧 是一種遵循 後進先出(LIFO) 原則的有序集合。新新增和待刪除的資料都儲存在棧的同一端棧頂,另一端就是棧底。新元素靠近棧頂,舊元素靠近棧底。
建立一個棧
我們需要自己建立一個棧,並且這個棧包含一些方法。
- push(element(s)):新增一個(或多個)新元素到棧頂
- pop():刪除棧頂的元素,並返回該元素
- peek():返回棧頂的元素,不對棧做任何操作
- isEmpty():檢查棧是否為空
- size():返回棧的元素個數
- clear():清空棧
function Stack() {
let items = [];
this.push = function(element) {
items.push(element);
};
this.pop = function() {
let s = items.pop();
return s;
};
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 = [];
}
}
複製程式碼
但是這樣的方式在建立多個例項的時候為建立多個items的副本。就不太合適了。 用ES如何6實現Stack類了。可以用WeakMap實現,並保證屬性是私有的。
let Stack = (function() {
const items = new WeakMap();
class Stack {
constructor() {
items.set(this, []);
}
getItems() {
let s = items.get(this);
return s;
}
push(element) {
this.getItems().push(element);
}
pop() {
return this.getItems().pop();
}
peek() {
return this.getItems()[this.getItems.length - 1];
}
isEmpty() {
return this.getItems().length == 0;
}
size() {
return this.getItems().length;
}
clear() {
this.getItems() = [];
}
}
return Stack;
})();
複製程式碼
用棧解決問題
棧可以解決十進位制轉為二進位制的問題、任意進位制轉換的問題、平衡園括號問題、漢羅塔問題。
// 例子十進位制轉二進位制問題
function divideBy2(decNumber) {
var remStack = new Stack(),
rem,
binaryString = '';
while (decNumber > 0) {
rem = Math.floor(decNumber % 2);
remStack.push(rem);
decNumber = Math.floor(decNumber / 2);
}
while(!remStack.isEmpty()) {
binaryString += remStack.pop().toString();
}
return binaryString;
}
// 任意進位制轉換的演算法
function baseConverter(decNumber, base) {
var remStack = new Stack(),
rem,
binaryString = '',
digits = '0123456789ABCDEF';
while (decNumber > 0) {
rem = Math.floor(decNumber % base);
remStack.push(rem);
decNumber = Math.floor(decNumber / base);
}
while(!remStack.isEmpty()) {
binaryString += digits[remStack.pop()].toString();
}
return binaryString;
}
複製程式碼