看完《學習JavaScript數據結構和算法》(第2版)的第3、4章的內容,關是于棧和隊列這2種數據結構的內容,以下是一些簡單的筆記整理和摘錄。
1、棧數據結構
1.1 棧的定義
棧是一種后進先出(LIFO,Last In First Out,后進先出)的有序集合。
1.2創建棧
用javascript的構造函數(類)可以創建表示棧,代碼如下
//ES5語法
function Stack(){
let items = [];
// 向棧添加元素
this.push = function(element){
items.push(element);
},
//向棧移除元素
this.pop = function(){
return items.pop();
},
//查看棧頂元素
this.peek = function(){
return items[items.length-1];
},
//查看棧長度
this.size = function (){
return items.length;
},
//檢查棧是否為空
this.isEmpty = function(){
return items.length == 0;
},
//清空棧元素
this.clear = function(){
items = [];
},
//打印棧元素
this.print = function(){
console.log(items.toString());
}
}
1.3 使用棧
1.2節的構造函數完整創建了棧,接下來使用棧的方式
let stack = new Stack();
console.log(stack.isEmpty()) //true,此時`stack`沒數據,結果為true
console.log(stack.push(5))
console.log(stack.print()) //5
2.隊列數據結構
隊列的創建跟棧是相似的,但原則不同。
2.1隊列的定義
隊列是遵循FIFO
(First In First Out
,先進先出)原則的一組有序的集合。
2.2創建隊列
跟上面創建棧的方法類似,唯一的區別是dequeue
方法和font
方法由于隊列原則不同所造成的。代碼如下:
//ES5語法
function Queue() {
//定義空數組,存儲隊列中的數據
let items = [];
//向隊列添加元素
this.enqueue = function(e){
items.push(e)
}
//向隊列移除元素
this.dequeue = function(){
return items.shift()
},
//查看隊列頭元素
this.front = function(){
return items[0]
},
//查看隊列長度
this.size = function (){
return items.length;
},
//檢查是否為空
this.isEmpty = function(){
return items.length == 0;
},
//打印隊列元素
this.print = function(){
console.log(items.toString())
}
}
let queue = new Queue();
console.log(queue.isEmpty()) //true
---分割線---
//ES6語法實現
let Queue2 = (function () {
const items = new WeakMap();
class Queue2 {
constructor () {
items.set(this, []);
}
enqueue(element) {
let q = items.get(this);
q.push(element);
}
dequeue() {
let q = items.get(this);
let r = q.shift();
return r;
}
//其他方法
}
return Queue2;
})();
2.3使用隊列
let queue = new Queue();
console.log(queue.isEmpty()); //輸出true
用ES6語法創建的類Queue2
也可以使用,輸出的測試結果是一樣的
2.4隊列的應用
基于隊列的應用是優先隊列
function PriorityQueue() {
let items = [];
function QueueElement (element, priority){
this.element = element;
this.priority = priority;
}
this.enqueue = function(element, priority){
let queueElement = new QueueElement(element, priority);
let added = false;
for (let i=0; i<items.length; i++){
if (queueElement.priority < items[i].priority){
items.splice(i,0,queueElement);
added = true;
break;
}
}
if (!added){
items.push(queueElement);
}
};
this.print = function(){
for (let i=0; i<items.length; i++){
console.log(`${items[i].element} -
${items[i].priority}`);
}
};
//其他方法和默認的Queue實現相同
}
let priorityQueue = new PriorityQueue()
//測試代碼
priorityQueue.enqueue("John", 2);
priorityQueue.enqueue("Jack", 1);
priorityQueue.enqueue("Camila", 1);
priorityQueue.print(); // 結果Jack1 , Camila 1, John 2