js實現資料結構--棧

陽光下的冷靜發表於2018-11-23

棧的定義:

棧是一種遵從後進先出(LIFO)原則的有序集合。新新增的或待刪除的元素都儲存在棧的同一端,稱作棧頂,另一端就叫棧底。

棧的特點:

後進先出:新元素都靠近棧頂,舊元素都接近棧底,所以新元素會比舊元素要先出棧

生活中棧的體現:

放在桌子上的一堆書和餐廳裡堆放的盤子

JS語法定義棧以及相關的方法:

建立棧:建立一個類來表示棧,宣告棧的各種屬性和方法,程式碼如下:

//宣告棧和棧的屬性和方法
    function Stack() {
        this.items = [];//儲存棧內元素的陣列
        this.top = 0;//棧頂元素的位置
        this.push = push;//進棧
        this.pop = pop;//出棧
        this.peek = peek;//棧頂元素
        this.clear=clear;//清空棧
        this.length=length//判空
      
    }

重寫棧的系列方法,程式碼如下:

function push(element) {//進棧
        this.items[this.top++] = element;
    }

    function pop() {//出棧
        return this.items[--this.top];
    }

    function peek() {//棧頂元素
        return this.items[this.top-1];
    }
   function length() {//當返回0是說明棧是空棧
        return this.top;
    }

    function clear() {//移除棧的所有元素
        this.top = 0;
    }

以上是棧的基本定義,包括屬性,方法等。

使用Stack類:

首先我們需要初始化Stack類,然後驗證一下棧是不是為空(輸出是true,因為棧內沒有新增元素)

var stack = new Stack();
console.log(stack.length==0);//輸出為true

接下來,往棧裡新增一些元素(這裡新增的是5和8,你也可以新增任何型別的元素) 

stack.push(5);
stack.push(8);

檢視棧頂元素

console.log(stack.peek());//輸出8

統計棧內元素個數和判空

console.log(items.length);//輸出2
console.log(stack.length==0);//輸出false

 用棧解決問題:

 數制之間的轉換,一般的是十進位制的數轉換成2進位制,8進位制,16進位制等。

 例如將十進位制的轉換成2進位制的,大概過程是這樣,如下圖:

十進位制轉換2進位制過程

  1. 利用該轉換的原理,實現其他的轉換,程式碼如下:
function baseConverter(decNumber,base){
       var remStack = new Stack();
       var rem, baseString = '',
           digits = '0123456789ABCDEF';
       while (decNumber > 0){
           rem = Math.floor(decNumber % base);
           remStack.push(rem);
           decNumber = Math.floor(decNumber / base);
       }
       while ( remStack.length() >0 ){
           baseString += digits[remStack.pop()];
       }
       return baseString;
   }
    console.log(baseConverter(10,2));//輸出1010
    console.log(baseConverter(100345,8));//輸出303771
    console.log(baseConverter(100345,16));//輸出187F9

判斷迴文字串

 //判斷迴文字串
    function isPalindrome(word) {
        var s = new Stack();
        for (var i = 0; i < word.length; i++) {
            s.push(word[i]);
        }
        var newStr = "";
        while (s.length() > 0) {
            newStr += s.pop();
        }
        if(word === newStr){
            return true;
        }
        return false;
    }
    console.log(isPalindrome("abcdcba"));//輸出true

遞迴計算

//使用棧實現遞迴,計算階乘
    function fun(num){
        if(num<=1){
            return 1;
        }else{
            return num*arguments.callee(num-1);
        }
    };
   console.log(fun(5));//輸出120

 

 

 

相關文章