01Javascript資料結構與演算法 之 棧

zhaoyezi發表於2018-08-23

學習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為止。

01Javascript資料結構與演算法 之 棧

例如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;
}
複製程式碼

相關文章