1. 程式人生 > >JS資料結構和演算法 --- 棧

JS資料結構和演算法 --- 棧

概念:表頭進行插入和刪除操作的線性表

核心思想:先進後出

作用:在程式語言的編譯器和記憶體中儲存變數、方法呼叫

操作方法:1)push() 進棧,即向棧裡新增元素

                  2)pop() 出棧,即把元素從棧中刪除

                  3)peak() 查詢棧頂元素,即查詢棧裡最頂部那個元素(最後新增)

                  4)isEmpty() 判斷棧是否為空

                  5)clear() 清空棧元素

                  6)size() 查詢棧的大小,即棧內元素個數

應用場景:1)進位制數的轉換; 2)有效字串的檢驗; 3)迷宮求解; 4)行編輯程式; 5)二叉樹的遍歷

棧的理解:可以把棧比作一個儲物櫃,進棧就是把物品放入儲物櫃,出棧即取出物品。像一般超市的寄存貨櫃,你把物品一個個的放進去(進棧),第一個放進去的在最裡面,依次堆積,最後一個放進去的在最外面;取物品時候,開櫃把商品一個個的取出來(出棧),首先取出的是最外面的一個商品(最後放進去的),然後依次往裡,也就是說最後放進去的最先取出,最先放進去的最後取出,即是棧的先進後出的思想。

在實際的開發中,會使用棧的思想去運算元組

例項:使用陣列來模擬棧的操作,並實現十進位制轉二進位制


/* jshint esversion: 6 */

/* 定義一個棧類 */
function stack(){
    // 棧
    let arr = [];          //私有屬性,只有類裡面的方法可以方法
    // 檢視棧
    this.getArr = ()=>{
        return arr;
    },
    // 進棧push()
    this.push = (element)=>{
        arr.push(element);
    },
    // 出棧pop()
    this.pop = ()=>{
        return arr.pop();
    },
    // 檢視棧頂peek()
    this.peek = ()=>{
        return arr[arr.length-1];    // 倒數第一個元素        
    },
    // 檢視棧是否為空isEmpty()
    this.isEmpty = ()=>{
        return arr.length == 0;
    },
    // 檢視棧元素個數size()
    this.size = ()=>{
        return arr.length;
    },
    // 清空棧clear()
    this.clear = ()=>{
        arr = [];
    }

}

/* 十進位制轉二進位制 */
function decimalToBinary(num){
    let s = new stack();          //呼叫上面的stack類
    let remainder;
    while(num>0){
        remainder = num%2;        //去2的餘數,即0或1
        s.push(remainder);
        num = Math.floor(num/2);  //向下取整,如5÷2=2.5向下取整2
    }
    return s.getArr().join('');   //把十進位制陣列轉成字串輸出
}

(完)