Javascript數據結構與算法學習(一)—— 棧

什麼是棧?

棧(Skipper):一種後進先出(LIFO:last in first out)的數據結構。

  • 棧結構的基本概念:棧頂,棧底,入棧,出棧
    棧結構圖解
  • 棧結構的相關操作

push入棧,pop出棧,peek檢查棧頂元素,isEmplty是否爲空,clear清空棧,size棧元素
在這裏插入圖片描述

棧結構的實現——數組

  • 實踐:使用類來封裝一個數組操作
function Stack(){
    var items = []; // 用var的目的是爲了私有變量,而不用this.items.
    // 入棧
    this.push=function(item){
        items.push(item)
    }
    // 獲取棧頂元素
    this.peek = function(){
        return items[items.length-1];
    }
    // 出棧:拿出棧頂元素
    this.pop = function(){
        items.pop()
    }
    // 棧是否爲空
    this.isEmpty = function(){
        return items.length===0
    }
    // 清空棧
    this.clear = function(){
        item = []
    }
    // 棧大小
    this.size = function(){
        return items.length;
    }
}

棧實例:十進制轉二進制數

原理:十進制轉2進制即十進制數對2取餘,每次得到的餘數則由底到頂拼接。

在這裏插入圖片描述

原理:
1、需要拿到的數? 如上圖,每一次取餘數,每一次取除2後的最小整數
2、將每次取出的餘數添加到棧結構
3、每次取出棧頂數拼接成二進制 。如上圖從最後除不盡的數1,到每次餘數拼接結果,1010

function to2(num){
    var stack = new Stack();
    var yushu;
    var res='';
    while(num>0){ // 不斷取餘,入棧
        yushu = num % 2;  
        stack.push(yushu); 
        num = Math.floor(num / 2); 
    }
    while(!stack.isEmpty()){ // 出棧拿結果
        res +=  stack.pop();
    }
    return res;
}
console.log(to2(10)); // 1010

棧的應用場景

  • 棧的作用:在編程語言的編譯器和內存中保存變量、方法調用
  • 棧和函數(函數調用棧):在計算機內存棧中,函數先調用先入棧,調用結束則出棧。如下結構
function fn1(){
	console.log('fn1 finished')
}
function fn2(){
	fn1();
	console.log('fn2 finished')
}
fn2();  // fn1 finished--->fn2 finished
  • 如上:fn2先調用進入內存棧,fn1後入棧,然後fn1執行完先出棧,fn2結束執行出棧,符合棧結構的“後進先出”規律
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章