學習JavaScript數據結構(一)——棧和隊列

前言

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

原文地址:學習javascript數據結構(一)——棧和隊列java

博主博客地址:Damonare的我的博客git

幾乎全部的編程語言都原生支持數組類型,由於數組是最簡單的內存數據結構。javascript也有數組類型,而數組呢,其實就是一種特殊的棧或是隊列,利用javascript Array所內置的API能夠很方便的模擬棧和隊列。github

正文

我想對於數組每個學過編程語言的都不會陌生吧,咱們知道,咱們能夠在數組的任意位置添加或是刪除元素,然而,有時候咱們還須要一種在添加或是刪除元素的時候有更多控制的數據結構。有兩種數據結構相似於數組。但在添加或是刪除元素的時候更爲的可控。他們就是棧和隊列。編程

棧是一種聽從後進先出(LIFO)原則的有序集合。新添加的或是待刪除的元素都保存在棧的末尾。咱們稱做棧頂,而另外一端咱們稱做棧底。


在現實生活中就有不少棧的例子,好比下圖的書本,這一摞書若是要取確定是先去最上面的那一本,但它是最後一個放上去的,也就是棧頂的元素都是待添加或是待刪除的。這就是後進先出的實際例子。
api

棧的建立

首先咱們先建立一個類:數組

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,也就是先進先出的原則。隊列從尾部添加新元素,從頂部移除元素,最新添加的元素必須排列在隊列的末尾。



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

隊列

隊列的建立

首先咱們聲明一個類:

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實現了棧和隊列這兩種數據結構。關於具體的應用的有機會補上。

相關文章
相關標籤/搜索