成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí):隊(duì)列

OpenDigg / 2544人閱讀

隊(duì)列的定義

隊(duì)列是遵循先進(jìn)先出原則的一組有序的項(xiàng),與棧的不同的是,棧不管是入棧還是出棧操作都是在棧頂操作,隊(duì)列則是在隊(duì)尾添加元素,隊(duì)頂移除,用一個(gè)圖來表示大概是這樣事的:

用一個(gè)更形象的例子就是:排隊(duì)服務(wù),總是先排隊(duì)的人會(huì)先接受服務(wù),當(dāng)然不考慮插隊(duì)的情況

隊(duì)列的創(chuàng)建

與棧的創(chuàng)建類似,首先創(chuàng)建一個(gè)表示隊(duì)列的函數(shù),然后定義一個(gè)數(shù)組用來保存隊(duì)列里的元素:

function Queue() {
  let items = []
}

創(chuàng)建隊(duì)列后需要為其定義一些方法,一般來說隊(duì)列包含以下方法:

enqueue(element):向隊(duì)的尾部添加一個(gè)新的項(xiàng)

dequeue():移除隊(duì)列第一項(xiàng),并返回被移除的元素

front():返回隊(duì)列第一項(xiàng),隊(duì)列不做任何變動(dòng)

isEmpty():如果隊(duì)列中沒有任何元素返回true,否則返回false

size():返回隊(duì)列包含的元素個(gè)數(shù)

具體實(shí)現(xiàn):

function Queue() {
  let items = []
  // 向隊(duì)列的尾部添加新元素
  this.enqueue = function (element) {
    items.push(element)
  }
  // 遵循先進(jìn)先出原則,從隊(duì)列的頭部移除元素
  this.dequeue = function () {
    return items.shift()
  }
  // 返回隊(duì)列最前面的項(xiàng)
  this.front = function () {
    return items[0]
  }
  // 返回隊(duì)列是否為空
  this.isEmpty = function () {
    return items.length === 0
  }
  // 返回隊(duì)列的長(zhǎng)度
  this.size = function () {
    return items.length
  }
  // 打印隊(duì)列,方便觀察
  this.print = function () {
    console.log(items.toString())
  }
}
隊(duì)列的使用

接下來讓我們看看隊(duì)列的使用:

let queue = new Queue()
queue.enqueue("a")
queue.enqueue("b")
queue.enqueue("c")
queue.dequeue()
queue.print()

首先向隊(duì)列中添加三個(gè)元素:a,b,c,然后移除隊(duì)列中的一個(gè)元素,最后打印現(xiàn)有隊(duì)列,讓我們一起圖解這個(gè)過程:

es6實(shí)現(xiàn)Queue

和實(shí)現(xiàn)Stack類一樣,也可以用es6的class語法實(shí)現(xiàn)Queue類,用WeakMap保存私用屬性items,并用閉包返回Queue類,來看具體實(shí)現(xiàn):

let Queue = (function () {
  let items = new WeakMap
  class Queue {
    constructor () {
      items.set(this, [])
    }
    enqueue (element) {
      let q = items.get(this)
      q.push(element)
    }
    dequeue () {
      let q = items.get(this)
      return q.shift()
    }
    front () {
      let q = items.get(this)
      return q[0]
    }
    isEmpty () {
      let q = items.get(this)
      return q.length === 0
    }
    size () {
      let q = items.get(this)
      return q.length
    }
    print () {
      let q = items.get(this)
      console.log(q.toString())
    }
  }
  return Queue
})()
let queue = new Queue()
queue.enqueue("a")
queue.enqueue("b")
queue.enqueue("c")
queue.dequeue()
queue.print()
優(yōu)先隊(duì)列

優(yōu)先隊(duì)列顧名思義就是:隊(duì)列中的每個(gè)元素都會(huì)有各自的優(yōu)先級(jí),在插入的時(shí)候會(huì)根據(jù)優(yōu)先級(jí)的高低順序進(jìn)行插入操作,和前面隊(duì)列實(shí)現(xiàn)有點(diǎn)不太一樣的地方,隊(duì)列中的元素多了有先級(jí)的屬性,下面來看具體代碼:

function PriorityQueue() {
  let items = []
  // 隊(duì)列元素,多定義一個(gè)優(yōu)先級(jí)變量
  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++) {
      //數(shù)字越小優(yōu)先級(jí)越高
      if (queueElement.priority < items[i].priority) {
        items.splice(i, 0, queueElement)
        added = true
        break
      }
    }
    if (!added) {
      items.push(queueElement)
    }
  }
  this.dequeue = function () {
    return items.shift()
  }
  this.front = function () {
    return items[0]
  }
  this.isEmpty = function () {
    return items.length === 0
  }
  this.size = function () {
    return items.length
  }
  this.print = function () {
    for (let i = 0; i < items.length; i++) {
      console.log(`${items[i].priority}-${items[i].element}`)
    }
  }
}
let priorityQueue = new PriorityQueue()
priorityQueue.enqueue("a", 3)
priorityQueue.enqueue("b", 2)
priorityQueue.enqueue("c", 1)
priorityQueue.dequeue()
priorityQueue.print()

入隊(duì)時(shí)如果隊(duì)列為空直接加入隊(duì)列,否則進(jìn)行比較,priority小的優(yōu)先級(jí)高,優(yōu)先級(jí)越高放在隊(duì)列的越前面,下面用一個(gè)圖來看調(diào)用過程:

循環(huán)隊(duì)列

循環(huán)隊(duì)列顧名思義就是:給定一個(gè)數(shù),然后迭代隊(duì)列,從隊(duì)列開頭移除一項(xiàng),然后再將其加到隊(duì)列末尾,當(dāng)循環(huán)到給定數(shù)字時(shí)跳出循環(huán),從隊(duì)首移除一項(xiàng),直至剩余一個(gè)元素,下面來看具體代碼:

unction Queue() {
  let 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.size = function () {
    return items.length
  }
  this.print = function () {
    console.log(items.toString())
  }
}
function loopQueue(list, num) {
  let queue = new Queue()
  for (let i = 0; i 1) {
    for (let j = 0; j
總結(jié)

這篇文章主要對(duì)隊(duì)列做了簡(jiǎn)單介紹,對(duì)隊(duì)列以及相關(guān)應(yīng)用做了簡(jiǎn)單實(shí)現(xiàn)。如果有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤剑瑲g迎批評(píng)指正,如果喜歡,歡迎點(diǎn)贊。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/101627.html

相關(guān)文章

  • 我對(duì)JS隊(duì)列學(xué)習(xí)

    摘要:我對(duì)隊(duì)列的學(xué)習(xí)什么是隊(duì)列隊(duì)列是遵循先進(jìn)先出原則的一組有序的項(xiàng)。最新添加的元素必須排在隊(duì)列的末尾。隊(duì)列的學(xué)習(xí)隊(duì)列的操作其實(shí)是和棧是差不多的,但是隊(duì)列只允許新數(shù)據(jù)在后端進(jìn)行添加。這里是最小優(yōu)先隊(duì)列,優(yōu)先值較小的元素被放置在隊(duì)列最前面。 我對(duì)JS隊(duì)列的學(xué)習(xí) 什么是隊(duì)列 隊(duì)列是遵循FIFO(先進(jìn)先出)原則的一組有序的項(xiàng)。隊(duì)列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊(duì)列的末尾。...

    Cristic 評(píng)論0 收藏0
  • 學(xué)習(xí)JavaScript異步、事件循環(huán)

    摘要:使用關(guān)鍵字來表示,在函數(shù)內(nèi)部使用來表示異步。執(zhí)行完了后,執(zhí)行棧再次為空,事件觸發(fā)線程會(huì)重復(fù)上一步操作,再取出一個(gè)消息隊(duì)列中的任務(wù),這種機(jī)制就被稱為事件循環(huán)機(jī)制。 async 函數(shù)是 Generator 函數(shù)的語法糖。使用 關(guān)鍵字 async 來表示,在函數(shù)內(nèi)部使用 await 來表示異步。想較于 Generator,Async 函數(shù)的改進(jìn)在于下面四點(diǎn): 內(nèi)置執(zhí)行器 Generato...

    nemo 評(píng)論0 收藏0
  • [js高手之路]javascript騰訊面試題學(xué)習(xí)封裝一個(gè)簡(jiǎn)易的異步隊(duì)列

    摘要:這道的面試題,是這樣的,頁(yè)面上有一個(gè)按鈕,一個(gè),點(diǎn)擊按鈕的時(shí)候,每隔秒鐘向的后面追加一個(gè)一共追加個(gè),的內(nèi)容從開始技術(shù),首先我們用閉包封裝一個(gè)創(chuàng)建元素的函數(shù)頁(yè)面上的個(gè)元素點(diǎn)我代碼點(diǎn)擊按鈕的時(shí)候,用回調(diào)函數(shù)嵌套方式,這里我加入個(gè),就已經(jīng)快受不了 這道js的面試題,是這樣的,頁(yè)面上有一個(gè)按鈕,一個(gè)ul,點(diǎn)擊按鈕的時(shí)候,每隔1秒鐘向ul的后面追加一個(gè)li, 一共追加10個(gè),li的內(nèi)容從0開始技...

    hzx 評(píng)論0 收藏0
  • JS數(shù)據(jù)結(jié)構(gòu)與算法_棧&隊(duì)列

    摘要:下一篇數(shù)據(jù)結(jié)構(gòu)與算法鏈表寫在前面說明數(shù)據(jù)結(jié)構(gòu)與算法系列文章的代碼和示例均可在此找到原計(jì)劃是把你不知道的三部全部看完的,偶然間朋友推薦了數(shù)據(jù)結(jié)構(gòu)與算法的一套入門視頻,學(xué)之。手頭上恰好有學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的書籍,便轉(zhuǎn)而先把數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)。 下一篇:JS數(shù)據(jù)結(jié)構(gòu)與算法_鏈表 寫在前面 說明:JS數(shù)據(jù)結(jié)構(gòu)與算法 系列文章的代碼和示例均可在此找到 原計(jì)劃是把《你不知道的Javascript》...

    AndroidTraveler 評(píng)論0 收藏0
  • Promise學(xué)習(xí)總結(jié)

    摘要:引擎線程也稱為內(nèi)核,負(fù)責(zé)處理腳本程序例如引擎引擎線程負(fù)責(zé)解析腳本,運(yùn)行代碼。對(duì)象代表一個(gè)未完成但預(yù)計(jì)將來會(huì)完成的操作。注意一旦新建就會(huì)立即執(zhí)行它屬于,無法取消。 寫在前面: 第一遍學(xué)Promise時(shí), 只是大概過了一遍, 感覺學(xué)的不夠深入, 這一篇算是對(duì)之前的一個(gè)總結(jié)吧. Promise在ES6中也屬于一個(gè)較難理解的一部分; 所以在學(xué)習(xí)一個(gè)比較難理解的知識(shí)點(diǎn)時(shí), 我們可以圍繞這個(gè)知識(shí)點(diǎn)...

    twohappy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<