數(shù)據(jù)結(jié)構(gòu)-棧和隊(duì)列小結(jié)

看完《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)和算法》(第2版)的第3、4章的內(nèi)容,關(guān)是于棧和隊(duì)列這2種數(shù)據(jù)結(jié)構(gòu)的內(nèi)容,以下是一些簡(jiǎn)單的筆記整理和摘錄。

1、棧數(shù)據(jù)結(jié)構(gòu)

1.1 棧的定義
棧是一種后進(jìn)先出(LIFO,Last In First Out,后進(jìn)先出)的有序集合。

1.2創(chuàng)建棧
用javascript的構(gòu)造函數(shù)(類)可以創(chuàng)建表示棧,代碼如下

//ES5語(yǔ)法
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];
  },
  //查看棧長(zhǎng)度
  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節(jié)的構(gòu)造函數(shù)完整創(chuàng)建了棧,接下來使用棧的方式

let stack = new Stack();
console.log(stack.isEmpty())  //true,此時(shí)`stack`沒數(shù)據(jù),結(jié)果為true
console.log(stack.push(5))
console.log(stack.print())  //5

2.隊(duì)列數(shù)據(jù)結(jié)構(gòu)

隊(duì)列的創(chuàng)建跟棧是相似的,但原則不同。
2.1隊(duì)列的定義
隊(duì)列是遵循FIFOFirst In First Out,先進(jìn)先出)原則的一組有序的集合。
2.2創(chuàng)建隊(duì)列
跟上面創(chuàng)建棧的方法類似,唯一的區(qū)別是dequeue方法和font方法由于隊(duì)列原則不同所造成的。代碼如下:

//ES5語(yǔ)法

function Queue() {
  //定義空數(shù)組,存儲(chǔ)隊(duì)列中的數(shù)據(jù)
  let items = [];
  //向隊(duì)列添加元素
  this.enqueue = function(e){
    items.push(e)
  }
  //向隊(duì)列移除元素
  this.dequeue = function(){
    return items.shift()
  },
  //查看隊(duì)列頭元素
  this.front = function(){
    return items[0]
  },
  //查看隊(duì)列長(zhǎng)度
  this.size = function (){
    return items.length;
  },
  //檢查是否為空
  this.isEmpty = function(){
    return items.length == 0;
  },
  //打印隊(duì)列元素
  this.print = function(){
    console.log(items.toString())
  }
}
let queue = new Queue();
console.log(queue.isEmpty())  //true

---分割線---

//ES6語(yǔ)法實(shí)現(xiàn)
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使用隊(duì)列

let queue = new Queue();
console.log(queue.isEmpty()); //輸出true

用ES6語(yǔ)法創(chuàng)建的類Queue2也可以使用,輸出的測(cè)試結(jié)果是一樣的
2.4隊(duì)列的應(yīng)用
基于隊(duì)列的應(yīng)用是優(yōu)先隊(duì)列

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}`);
    }
  };
  //其他方法和默認(rèn)的Queue實(shí)現(xiàn)相同
}
let priorityQueue = new PriorityQueue()
 //測(cè)試代碼
priorityQueue.enqueue("John", 2);
priorityQueue.enqueue("Jack", 1);
priorityQueue.enqueue("Camila", 1);
priorityQueue.print(); //  結(jié)果Jack1 , Camila 1, John 2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容