javascript數據結構與算法---棧

javascript數據結構與算法---棧javascript

    在上一遍博客介紹了下列表,列表是最簡單的一種結構,可是若是要處理一些比較複雜的結構,列表顯得太簡陋了,因此咱們須要某種和列表相似可是更復雜的數據結構---棧。棧是一種高效的數據結構,由於數據只能在棧頂添加或刪除,因此這樣操做很快,並且容易實現。java

一:對棧的操做。算法

   棧是一種特殊的列表,棧內的元素只能經過列表的一端訪問,這一端陳爲棧頂。好比餐館裏面洗盤子,只能先洗最上面的盤子,盤子洗完後,也只能螺到這一摞盤子的最上面。棧被稱爲 "後入先出"(LIFO)的數據結構。數組

   因爲棧具備後入先出的特色,因此任何不在棧頂的元素都沒法訪問,爲了獲得棧低的元素,必須先拿掉上面的元素。咱們能夠對棧的兩種主要操做是將一個元素 壓入棧 和 將一個元素 彈出棧。入棧咱們可使用方法push()方法,出棧咱們使用pop()方法。pop()方法雖然能夠訪問棧頂的元素,可是調用該方法後,棧頂元素也就從棧中被永久性的刪除了。另外一個咱們很經常使用的方法是peek(),該方法只返回棧頂元素,而不刪除它。數據結構

    入棧和出棧的實列圖以下:函數

 

  push(),pop()和peek()是棧的三個主要方法,可是棧還有其餘方法和屬性。以下:this

  clear():清除棧內的全部元素。spa

  length(): 記錄棧內元素的個數。prototype

二:對棧的實現以下:code

 咱們能夠先實現棧類的方法開始;以下:

  function Stack() {
      this.dataStore = [];
      this.top = 0;
  }

如上:dataStore 是保存棧內的全部元素。變量top記錄棧頂的位置,初始化爲0. 表示棧頂對應數組的起始位置爲0,若是有元素被壓入棧。該變量值將隨之變化。

咱們還有以下幾個方法:push(), pop(), peek(),clear(),length();

1.  push()方法;當向棧內壓入一個新元素時,須要將其保存在數組中變量top所對應的位置,而後top值加1,讓其指向數組中下一個位置。以下代碼:

function  push(element) {
     this.dataStore[this.top++] = element;
}

2. pop()方法與push()方法相反---它返回棧頂元素,同時將top值減1.以下代碼:

   function pop(){
       return this.dataStore[--this.top];
   }

3. peek()方法返回數組的第top-1個位置的元素,即棧頂元素;

    function peek(){
        return this.dataStore[this.top - 1];
    }

4. length()方法 有時候咱們要知道棧內有多少個元素,咱們能夠經過返回變量top值的方式返回棧內的元素個數,以下代碼:

     function length(){
         return this.top;
     }

5. clear(); 有時候咱們要清空棧,咱們將變量top值設爲0;以下代碼:

   function clear() {

        this.top = 0;

    }

以下全部代碼:

function Stack() { this.dataStore = []; this.top = 0; } Stack.prototype = { // 向棧中壓入一個新元素
    push: function(element) { this.dataStore[this.top++] = element; }, // 訪問棧頂元素,棧頂元素永久的被刪除了
    pop: function(){ return this.dataStore[--this.top]; }, // 返回數組中的 top-1 個位置的元素,即棧頂元素
    peek: function(){ return this.dataStore[this.top - 1]; }, // 棧內存儲了多少個元素
    length: function(){ return this.top; }, // 清空棧
    clear: function(){ this.top = 0; } }; demo實例以下: var stack = new Stack(); stack.push("a"); stack.push("b"); stack.push("c"); console.log(stack.length()); // 3
console.log(stack.peek());   // c

var popped = stack.pop(); console.log(popped); // c
 console.log(stack.peek()); // b
 stack.push("d"); console.log(stack.peek()); // d
 stack.clear(); console.log(stack.length()); // 0
 console.log(stack.peek()); // undefined

下面咱們能夠實現一個階乘函數的遞歸定義;好比5!的階乘 5!= 5 * 4 * 3 * 2 * 1;

 以下代碼:

function fact(n) { var s = new Stack(); while(n > 1) { s.push(n--); } var product = 1; while(s.length() > 0) { product *= s.pop(); } return product; } console.log(fact(5));

上面的代碼含義是:先數字5傳入函數,使用while循環,每次自減1的以前,把本身使用棧的函數push()壓入棧內,直到變量n  小於 1爲止。而後定義一個變量product;經過棧的length()的方法判斷是否大於0 且每次執行 product* = s.pop();  pop()方法返回棧頂元素,且從棧中刪掉該元素。因此每次執行一次,就刪掉一個元素,直到s.length() <= 0 爲止。因此 product = 5*4*3*2*1 .等操做。

相關文章
相關標籤/搜索