我對JS棧的簡單學習

我對棧的學習

由於是個新手,因此都是最簡單的知識學習梳理。git

什麼是棧

數組是計算機科學中最經常使用的數據結構,是數據元素的集合。有時候咱們須要一種添加或者刪除元素時更可控的數據結構,他們就是隊列和棧。數組

  • 隊列是聽從先進先出(FIFO)原則的一組有序的項,隊列在尾部添加新元素,並從頂部移除元素。這裏不先詳細說明。數據結構

  • 棧是一種聽從後進先出(LIFO)原則的有序集合,新添加的或者待刪除的元素都保留在棧的末尾,稱做棧頂,另外一端叫作棧底。新元素都在棧頂。學習

棧的示意圖

棧也被用在編譯語言的編譯器和內存中保存變量、方法調用等。this

棧的學習

  • 棧的建立spa

建立一個類來表示棧。code

function Stack() {
    //各類屬性和方法的聲明
}

須要一種數據結構來保存棧裏的元素,這裏選擇數組。隊列

var items = [];
  • 棧的基本操做內存

入棧方法:添加元素到棧,這裏要注意添加到棧的元素只能到棧頂,也就是棧的末尾。element

this.push = function (element) {
    items.push(element);
}

出棧方法:移除棧裏的元素,注意移除的是最後添加進去的元素。

this.pop = function () {
    return items.pop();
}

對於棧來講只能用push和pop方法來進行添加和刪除元素。

獲取棧頂元素:咱們想知道最後添加的元素是什麼

this.peek = function () {
    return items[items.length - 1];
}

別忘了這裏咱們使用數組來存儲棧內的元素

判斷棧空:棧爲空返回true。

this.isEmpty = function () {
    return items.length == 0;
}

對於集合,最好是使用size來代替length,這裏咱們簡單了。

清空棧:移除棧內的全部元素,把棧清空

this.clear = function () {
    items = []; //最簡單的方式
}

棧的使用

首先須要初始化Stack類,而後驗證一下棧是否爲空

var stack = new Stack();
console.log(stack.isEmpty()); //true,此時尚未添加元素

而後添加元素入棧

stack.push(8);
stack.push(4);

得到最後添加的元素

console.log(stack.peek()); //4,由於4是最後被添加的元素

再添加一個元素

stack.push(11);
console.log(stack.size()); //輸出3,此時棧裏有3個元素
console.log(stack.isEmpty()); //false,此時棧裏已經有元素了

移除兩個元素

stack.pop();
stack.pop();
console.log(stack.size()); //1,此時只剩下一個元素

進制的轉換

10進制轉換爲其餘進制一般都是整除法。(能夠自行搜索進制轉換時的方法以及形式)

/**
 * [數字,轉換成相應進制的進制數]
 * @param  {[Number]} decNumber [想轉的數]
 * @param  {[Number]} base      [想轉的進制]
 * @return {[Number]}           [轉換進制後的數]
 */
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()) {
        //這裏經過digits的下標來得到相應字符。好比pop出7,這裏digits[7]就是7,pop出16,這裏digits[16]就是F
        baseString += digits[remStack.pop()];
    }

    return baseString;
}

baseConverter(100345, 2); //11000011111111001
baseConverter(100345, 8); //303771
baseConverter(100345, 16); //187F9

下一篇簡單的學習隊列。。。。