學習JavaScript資料結構與演算法資料總結。
1. 定義
棧是一種遵循後進先出(LIFO)原則的有序集合。新新增的元素儲存在棧頂,而最先新增的元素儲存在棧底。
2. 棧例項
我們使用陣列,來儲存棧的元素。為棧宣告一些方法:
- push(elements): 新增一個或多個新元素到棧頂
- pop(): 移除棧頂的元素,同時返回被移除的元素
- peek(): 獲取棧頂的元素,不對棧做任何修改
- isEmpty(): 棧中元素不存在返回true,否則返回false
- clear(): 清除棧裡的所有元素
- size(): 返回棧裡的元素個數
function Stack() {
// 儲存棧元素
var items = [];
this.push = (elements) => {
if ((typeof elements) === 'number') {
items.push(elements);
} else {
items.push(...elements);
}
};
this.pop = () => (items.pop());
this.peek = () => (items[items.length - 1]);
this.isEmpty = () => (items.length === 0);
this.clear = () => (items = []);
this.size = () => (items.length);
this.print = () => (console.log(items.toString()));
}
let stack = new Stack();
stack.push([1,2,3]);
console.log(stack.pop());
console.log(stack.size());
console.log(stack.print());
console.log(stack.isEmpty());
console.log(stack.clear());
console.log(stack.size(), stack.isEmpty());
複製程式碼
3. 十進位制轉二進位制
十進位制轉二進位制:將十進位制數和2
整除(二進位制滿2進1),直到結果是0為止。
例如
10
的二進位制就是:1010,下面通過棧的方式編寫10進位制轉2進位制的函式:function divideBy2(decNumber) {
let stack = new Stack();
let binaryString = '';
// 取餘數存放在stack中
while(decNumber / 2) {
let rem = Math.floor(decNumber % 2);
stack.push(rem);
decNumber = Math.floor(decNumber / 2);
}
console.log(stack.print())
// 遍歷取出餘數
while(!stack.isEmpty()) {
binaryString += stack.pop().toString();
}
return binaryString;
}
複製程式碼
只需要改變一個地方。在將十進位制轉成二進位制時,餘數是0或1;在將十進位制轉成八進位制時,餘數是0到8之間的數;但是將十進位制轉成16進位制時,餘數是0到8之間的數字加上A、 B、 C、D、 E和F(對應10、 11、 12、 13、 14和15)
function baseConverter(decNumber, base){
var remStack = new Stack(),
rem,
baseString = '',
// 儲存對應的餘數
digits = '0123456789ABCDEF';
while (decNumber > 0){
rem = Math.floor(decNumber % base);
remStack.push(rem);
decNumber = Math.floor(decNumber / base);
}
while (!remStack.isEmpty()){
baseString += digits[remStack.pop()];
}
return baseString;
}
複製程式碼