主頁 > 企業開發 > JS資料結構與演算法-佇列結構

JS資料結構與演算法-佇列結構

2022-11-08 07:35:20 企業開發

佇列結構

一.認識佇列

  • 受限的線性結構:
    • 我們已經學習了一種受限的線性結構:堆疊結構.
    • 并且已經知道這種受限的資料結構對于解決某些特定問題,會有特別的
      效果.
    • 下面,我們再來學習另外一個受限的資料結構:佇列.
  • 佇列(Queue),它是一種受限的線性表,先進先出(FIFO First ln First Out)
    • 受限之處在于它只允許在表的前端( front )進行洗掉操作
    • 而在表的后端(rear)進行插入操作
  • 生活中類似的佇列結構
    • 生活中類似佇列的場景就是非常多了
    • 比如在電影院,商場,甚至是廁所排隊.
    • 優先排隊的人,優先處理.(買票,結賬, WC)

二.佇列的應用

  • 列印佇列:
    • 有五份檔案需要列印,這些檔案會按照次序放入到列印佇列中.
    • 列印機會依次從佇列中取出檔案,優先放入的檔案,優先被取出,并且對該檔案進行列印.
    • 以此類推,直到佇列中不再有新的檔案.
  • 執行緒佇列:
    • 在開發中,為了讓任務可以并行處理,通常會開啟多個執行緒.
    • 但是,我們不能讓大量的執行緒同時運行處理任務.(占用過多的資源)
    • 這個時候,如果有需要開啟執行緒處理任務的情況,我們就會使用執行緒佇列.
    • 執行緒佇列會依照次序來啟動執行緒,并且處理對應的任務.
  • 佇列如何實作呢?
    • 我們一起來研究一下佇列的實作.

三.佇列類的創建

  • 佇列的實作和堆疊一樣,有兩種方案:
    • 基于陣列實作
    • 基于鏈表實作
function Queue() {
    //屬性
    this.items = []
}

四.佇列的常見操作

  • 佇列有哪些常見的操作呢?
    • enqueue(element):向佇列尾部添加一個(或多個)新的項,
    • dequeue()∶移除佇列的第一(即排在佇列最前面的)項,并回傳被移除的元素,
    • front():回傳佇列中第一個元素——最先被添加,也將是最先被移除的元素,佇列不做任何變動(不移除元素,只回傳元素資訊——與Stack類的peek方法非常類似),
    • isEmpty):如果佇列中不包含任何元素,回傳true,否則回傳false,
    • size():回傳佇列包含的元素個數,與陣列的length屬性類似,
    • toString():將佇列中的內容,轉成字串形式
  • 現在,,我們來實作這些方法.
    • 其實很堆疊中方法的實作非常相似.因為我們的佇列也是基于陣列的
//1.將元素加入到佇列中
    Queue.prototype.enqueue = function (element) {
        this.items.push(element)
    }

    //2.從佇列中洗掉前端元素
    Queue.prototype.dequeue = function () {
        return this.items.shift()
    }

    //3.查看前端元素
    Queue.prototype.front = function () {
        return this.items[0]
    }

    //4.查看佇列是否為空
    Queue.prototype.isEmpty = function () {
        return this.items.length === 0
    }

    //5.查看佇列中元素的個數
    Queue.prototype.size = function () {
        return this.items.length
    }

    //6.toString方法
    Queue.prototype.toString = function () {
        let resultString = ''
        for (let i = 0; i < this.items.length; i++) {
            resultString += this.items[i] + ''
        }
        return resultString
    }

五.擊鼓傳花

  • 擊鼓傳花是一個常見的面試演算法題.使用佇列可以非常方便的實作最終的結果.

  • 原游戲規則:

    • 班級中玩一個游戲,所有學生圍成一圈,從某位同學手里開始向旁邊的同學傳一束花.- 這個時候某個人(比如班長),在擊鼓,鼓聲停下的一顆,花落在誰手里,誰就出來表演節目.
  • 修改游戲規則:

    • 我們來修改一下這個游戲規則.
    • 幾個朋友一起玩一個游戲,圍成一圈,開始數數,數到某個數字的人自動淘汰.
    • 最后剩下的這個人會獲得勝利,請問最后剩下的是原來在哪一個位置上的人?
  • 封裝一個基于佇列的函式

    • 引數:所有參與人的姓名,基于的數字
    • 結果:最終剩下的一人的姓名
//擊鼓傳花
function paseGame(nameList, num) {
    //創建一個佇列
    let queue = new Queue()

    //將所有人依次加入佇列
    for (let i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i])
    }

    //開始數數字
    while (queue.size() > 1) {
        //不是num的時候嗎,重新加入到佇列的末尾
        //num數字之前的人重新放入到佇列的末尾
        for (let i = 0; i < num - 1; i++) {
            queue.enqueue(queue.dequeue())
        }
        //num對應的這個人直接從佇列中洗掉 
        queue.dequeue()
    }
    //獲取剩下的結果
    let endName = queue.front()
    console.log(endName);
    return nameList.indexOf(endName)
}

paseGame(['lisi', 'zhangsan', 'fgbfd', 'tom', 'jack', 'lisa', 'ez', 'laoshu', 'jikdf', 'dsada', 'poru', 'fjds'], 6)//fgbfd

六.優先級佇列

優先級佇列的特點:

  • 我們知道,普通的佇列插入一個元素,資料會被放在后端.并且需要前面所有的元素都處理完成后才會處理前面的資料.
  • 但是優先級佇列,在插入一個元素的時候會考慮該數
    據的優先級.
  • 和其他資料優先級進行比較.
  • 比較完成后,可以得出這個元素在佇列中正確的位置
  • 其他處理方式,和基本佇列的處理方式一樣.

優先級佇列主要考慮的問題:

  • 每個元素不再只是一個資料,而且包含資料的優先級
  • 在添加方式中,根據優先級放入正確的位置.

優先級佇列的應用:

  • 一個現實的例子就是機場登機的順序
    • 頭等艙和商務艙乘客的優先級要高于經濟艙乘客,
    • 在有些國家,老年人和孕婦(或帶小孩的婦女)登機時也享有高于其他乘客的優先級,
  • 另一個現實中的例子是醫院的(急診科)候診室,
    • 醫生會優先處理病情比較嚴重的患者,
    • 當然,一般情況下是按照排號的順序,
  • 計算機中,我們也可以通過優先級佇列來重新排序佇列中任務的順序
    • 比如每個執行緒處理的任務重要性不同,我們可以通過優先級的大小,來決定該執行緒在佇列中被處理的次序.

七.優先級佇列的實作

  • 現優先級佇列相對佇列主要有兩方面需要考慮:
    • 1)封裝元素和優先級放在一起(可以封裝一個新的建構式)
    • 2)添加元素時,將新插入元素的優先級和佇列中已經存在的元素優先級進行比較,以獲得自己正確的位置.
//封裝優先級佇列
function PriorityQueue() {
    //在PriorityQueue重新創建了一個類
    function QueueElemnt(element, priority) {
        this.element = element
        this.priority = priority
    }

    //封裝屬性
    this.items = []

    //1.實作插入方法
    PriorityQueue.prototype.enqueue = function (element, priority) {
        //創建QueueElement物件
        let queueElemnt = new QueueElemnt(element, priority)

        //判斷佇列是否為空
        if (this.items.length === 0) {
            this.items.push(queueElemnt)
        } else {
            let added = false
            for (let i = 0; i < this.items.length; i++) {
                if (queueElemnt.priority < this.items[i].priority) {
                    this.items.splice(i, 0, queueElemnt)
                    added = true
                    break
                }
            }
            if (!added) {
                this.items.push(queueElemnt)
            }
        }
    }

    //2.從佇列中洗掉前端元素
    PriorityQueue.prototype.dequeue = function () {
        return this.items.shift()
    }

    //3.查看前端元素
    PriorityQueue.prototype.front = function () {
        return this.items[0]
    }

    //4.查看佇列是否為空
    PriorityQueue.prototype.isEmpty = function () {
        return this.items.length === 0
    }

    //5.查看佇列中元素的個數
    PriorityQueue.prototype.size = function () {
        return this.items.length
    }

    //6.toString方法
    PriorityQueue.prototype.toString = function () {
        let resultString = ''
        for (let i = 0; i < this.items.length; i++) {
            resultString += this.items[i] + ''
        }
        return resultString
    }
}

// 測驗代碼
let pq = new PriorityQueue()
pq.enqueue('abc', 111)
pq.enqueue('cba', 151)
pq.enqueue('nba', 66)
pq.enqueue('wba', 856)
console.log(pq);

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528833.html

標籤:JavaScript

上一篇:BUUCTF [ACTF新生賽2020]SoulLike題解(非爆破)

下一篇:Vue3 企業級優雅實戰 - 組件庫框架 - 1 搭建 pnpm monorepo

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more