學習JavaScript資料結構(一)——棧和佇列

Damonare發表於2019-03-04

前言

只要你不計較得失,人生還有什麼不能想法子克服的。

原文地址:學習javascript資料結構(一)——棧和佇列

博主部落格地址:Damonare的個人部落格

幾乎所有的程式語言都原生支援陣列型別,因為陣列是最簡單的記憶體資料結構。javascript也有陣列型別,而陣列呢,其實就是一種特殊的棧或是佇列,利用javascript Array所內建的API可以很方便的模擬棧和佇列。

正文

我想對於陣列每一個學過程式語言的都不會陌生吧,我們知道,我們可以在陣列的任意位置新增或是刪除元素,然而,有時候我們還需要一種在新增或是刪除元素的時候有更多控制的資料結構。有兩種資料結構類似於陣列。但在新增或是刪除元素的時候更為的可控。他們就是棧和佇列。

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


在現實生活中就有很多棧的例子,比如下圖的書本,這一摞書如果要取肯定是先去最上面的那一本,但它是最後一個放上去的,也就是棧頂的元素都是待新增或是待刪除的。這就是後進先出的實際例子。

學習JavaScript資料結構(一)——棧和佇列

棧的建立

首先我們先建立一個類:

function Stack(){
    //各種屬性和方法的宣告
}複製程式碼

然後我們需要一種資料結構來儲存棧裡面的資料:

var items=[];複製程式碼

接下來,我們需要給棧宣告一些方法:

  • push(element):新增一個或是幾個新元素到棧頂。
  • pop():移除棧頂的元素,同時返回被移除元素。
  • peek():返回棧頂的元素,但並不對棧頂的元素做出任何的修改。
  • isEmpty():檢查棧內是否有元素,如果有返回true,沒有返回false。
  • clear():清除棧裡的元素。
  • size():返回棧的元素個數。
  • print():列印棧裡的元素。

棧的完整程式碼

我們通過javascript提供的API,實現棧如下:

function Stack() {

    var items = [];

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

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

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

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

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

    this.clear = function(){
        items = [];
    };

    this.print = function(){
        console.log(items.toString());
    };

    this.toString = function(){
        return items.toString();
    };
}複製程式碼

使用棧

建立完了棧,也給他了方法,然後我們來例項化一個物件:

var stack=new Stack();
console.log(stack.isEmpty());
//true
stack.push(1);
stack.push(3);
//新增元素
console.log(stack.peek());
//輸出棧頂元素3
console.log(stack.size());
//2
//輸出元素個數複製程式碼

其餘方法呼叫讀者可自行嘗試。

佇列

我們已經接觸了棧,接下來要說的佇列和棧十分相似,他們都是線性表,元素都是有序的
。佇列和棧不同的是,佇列遵循的是FIFO,也就是先進先出的原則。佇列從尾部新增新元素,從頂部移除元素,最新新增的元素必須排列在佇列的末尾。



在現實生活中,最常見的佇列就是排隊,如下圖,先進入佇列的先接受服務,後進入佇列的必須排在佇列末尾。

學習JavaScript資料結構(一)——棧和佇列
佇列

佇列的建立

首先我們宣告一個類:

function(){
    //這裡是佇列的屬性和方法
}複製程式碼

然後我們同樣建立一個儲存元素的陣列:

var items=[];複製程式碼

接下來宣告一些佇列可用的方法:

  • enqueue(element):向佇列尾部新增一個(或是多個)元素。
  • dequeue():移除佇列的第一個元素,並返回被移除的元素。
  • front():返回佇列的第一個元素——最先被新增的也是最先被移除的元素。佇列不做任何變動。
  • isEmpty():檢查佇列內是否有元素,如果有返回true,沒有返回false。
  • size():返回佇列的長度。
  • print():列印佇列的元素。

佇列的完整程式碼

我們通過javascript提供的API,實現佇列如下:

function Queue() {

    var items = [];

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

    this.dequeue = function(){
        return items.shift();
    };

    this.front = function(){
        return items[0];
    };

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

    this.clear = function(){
        items = [];
    };

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

    this.print = function(){
        console.log(items.toString());
    };
}複製程式碼

使用佇列

建立完了佇列,也給他了方法,然後我們來例項化一個物件:

var queue=new Queue();
console.log(queue.isEmpty());
//true
queue.enqueue(1);
queue.enqueue(3);
//新增元素
console.log(queue.front());
//返回佇列的第一個元素1
console.log(queue.size());
//2
//輸出元素個數複製程式碼

後記

這篇部落格使用javascript實現了棧和佇列這兩種資料結構。關於具體的應用的有機會補上。

相關文章