數(shù)據(jù)結構-棧和隊列小結

看完《學習JavaScript數(shù)據(jù)結構和算法》(第2版)的第3、4章的內容,關是于棧和隊列這2種數(shù)據(jù)結構的內容,以下是一些簡單的筆記整理和摘錄。

1、棧數(shù)據(jù)結構

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

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

//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節(jié)的構造函數(shù)完整創(chuàng)建了棧,接下來使用棧的方式

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

2.隊列數(shù)據(jù)結構

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

//ES5語法

function Queue() {
  //定義空數(shù)組,存儲隊列中的數(shù)據(jù)
  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語法實現(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使用隊列

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

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

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容