前言
只要你不計較得失,人生還有什麼不能想法子克服的。
原文地址:學習javascript數據結構(一)——棧和隊列
博主博客地址:Damonare的個人博客
幾乎所有的編程語言都原生支持數組類型,因爲數組是最簡單的內存數據結構。javascript也有數組類型,而數組呢,其實就是一種特殊的棧或是隊列,利用javascript Array所內置的API可以很方便的模擬棧和隊列。
正文
我想對於數組每一個學過編程語言的都不會陌生吧,我們知道,我們可以在數組的任意位置添加或是刪除元素,然而,有時候我們還需要一種在添加或是刪除元素的時候有更多控制的數據結構。有兩種數據結構類似於數組。但在添加或是刪除元素的時候更爲的可控。他們就是棧和隊列。
棧
棧是一種遵從後進先出(LIFO)原則的有序集合。新添加的或是待刪除的元素都保存在棧的末尾。我們稱作棧頂,而另一端我們稱作棧底。
在現實生活中就有很多棧的例子,比如下圖的書本,這一摞書如果要取肯定是先去最上面的那一本,但它是最後一個放上去的,也就是棧頂的元素都是待添加或是待刪除的。這就是後進先出的實際例子。
棧的創建
首先我們先創建一個類:
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實現了棧和隊列這兩種數據結構。關於具體的應用的有機會補上。