电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JS中隊列和雙端隊列實現及應用詳解

瀏覽:94日期:2024-04-18 09:56:13

隊列

隊列 雙端隊列數據結構 應用 用擊鼓傳花游戲模擬循環隊列 用雙端對列檢查一個詞是否構成回文 生成 1 到 n 的二進制數

隊列和雙端隊列

隊列遵循先進后出(FIFO, 也稱為先來先服務) 原則的. 日常有很多這樣場景: 排隊購票、銀行排隊等.由對列的特性,銀行排隊為例, 隊列應該包含如下基本操作:

加入隊列(取號) enqueue 從隊列中移除(辦理業務離開) dequeue 當前排隊號碼(呼叫下一個人) peek 當前隊列長度(當前排隊人數) size 判斷隊列是不是空 isEmpty

class Queue { constructor() { // 隊列長度, 類數組 length this.count = 0 // 隊列中所有項 this.items = {} // 記錄對列頭, 類數組 index this.lowestCount = 0 } enqueue(ele) { this.items[this.count++] = ele } dequeue() { if (this.isEnpty()) { return undefined } const ele = this.items[this.lowestCount] delete this.items[this.lowestCount] this.lowestCount++ return ele } peek() { if (this.isEnpty()) { return } return this.items[this.lowestCount] } size() { /** * 當隊列為非空時: * 1. count 是長度 * 2. lowestCount 是下標 * 兩者關系應該 lowestCount = count - 1 */ return this.count - this.lowestCount } isEnpty() { return this.size() == 0 } clear() { this.items = {} this.lowestCount = 0 this.count = 0 } toString() { if (this.isEnpty()) { return ’’ } let objString = `${this.items[this.lowestCount]}` for (let i = this.lowestCount + 1; i < this.count; i++) { objString = `${objString}, ${this.items[i]}` } return objString }}

雙端隊列(deque 或 double-ended queue)

什么是雙端隊列?

允許從前端(front)和后端(rear)添加元素, 遵循的原則先進先出或后進先出.雙端隊列可以理解為就是棧(后進先出)和隊列(先進先出)的一種結合體. 既然是結合那么相應的操作也支持隊列,棧的操作. 下面我們定義一個Deque

addFront removeFront addBack removeBack clear isEmpty peekFront prekBack size toString class Deque {

constructor() { this.items = {} this.count = 0 this.lowestCount = 0 } addFront(ele) { if (this.isEmpty()) { this.items[this.count] = ele } else if (this.lowestCount > 0) { this.lowestCount -= 1 this.items[this.lowestCount] = ele } else { for (let i = this.count; i > 0; i--) {this.items[i] = this.items[i - 1] } this.items[0] = ele } this.count++ return ele } removeFront() { if (this.isEmpty()) { return } const delEle = this.items[this.lowestCount] delete this.items[this.lowestCount] this.lowestCount++ return delEle } addBack(ele) { this.items[this.count] = ele this.count++ } removeBack() { if (this.isEmpty()) { return } const delEle = this.items[this.count - 1] delete this.items[this.count - 1] this.count-- return delEle } peekFront() { if (this.isEmpty()) { return } return this.items[this.lowestCount] } peekBack() { if (this.isEmpty()) { return } return this.items[this.count - 1] } size() { return this.count - this.lowestCount } isEmpty() { return this.size() === 0 } clear() { this.items = {} this.count = 0 this.lowestCount = 0 } toString() { if (this.isEmpty()) { return ’’ } let objString = `${this.items[this.lowestCount]}` for (let i = this.lowestCount + 1; i < this.count; i++){ objString = `${objString}, ${this.items[i]}` } return objString }}

隊列的應用

擊鼓傳花游戲

擊鼓傳花游戲: 簡單描述就是一群人圍成一個圈傳遞花,喊停的時花在誰手上就將被淘汰(每個人都可能在前端,每個參與者在隊列位置會不斷變化),最后只剩下一個時就是贏者. 更加詳細可以自行查閱.

下面通過代碼實現:

function hotPotato(elementsList, num) { // 創建一個容器 const queue = new Queue() const elimitatedList = [] // 把元素(參賽者)加入隊列中 for (let i = 0, len = elementsList.length; i < len; i++) { queue.enqueue(elementsList[i]) } /** * 擊鼓傳花 * 首先隊列規則: 先進先出 * 那么在傳花過程中,任何一個元素都可能是前端, 在傳花的過程中應該就是前端位置不斷變化. * 當喊停的時(num 循環完), 也就是花落在誰手(誰在前端)則會被淘汰*(移除隊列) */ while (queue.size() > 1) { for (let j = 0; j < num; j++) { queue.enqueue(queue.dequeue()) } elimitatedList.push(queue.dequeue()) } return { winer: queue.dequeue(), elimitatedList }}

代碼運行如下:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]console.log(hotPotato(arr, Math.ceil(Math.random() * 10))) // { winer: 5, elimitatedList: [4, 8, 2, 7, 3,10, 9, 1, 6]}console.log(hotPotato(arr, Math.ceil(Math.random() * 10))) // { winer: 5, elimitatedList: [4, 8, 2, 7, 3,10, 9, 1, 6]}console.log(hotPotato(arr, Math.ceil(Math.random() * 10))) // { winer: 8, elimitatedList: [10, 1, 3, 6, 2,9, 5, 7, 4]}

判斷回文

上一篇棧中也有涉及回文的實現, 下面我們通過雙端隊列來實現同樣的功能.

function palindromeChecker(aString) { if (!aString || typeof aString !== ’string’ || !aString.trim().length) { return false } const deque = new Deque() const lowerString = aString.toLowerCase().split(’ ’).join(’’) // 加入隊列 for (let i = 0; i < lowerString.length; i++) { deque.addBack(lowerString[i]) } let isEqual = true let firstChar = ’’ let lastChar = ’’ while (deque.size() > 1 && isEqual) { firstChar = deque.removeFront() lastChar = deque.removeBack() if (firstChar != lastChar) { isEqual = false } } return isEqual}

下面通過代碼演示下:

console.log(palindromeChecker(’abcba’)) // true 當前為回文

JS中隊列和雙端隊列實現及應用詳解

生成 1 到 n 的二進制數

function generatePrintBinary(n) { var q = new Queue() q.enqueue(’1’) while (n-- > 0) { var s1 = q.peek() q.dequeue() console.log(s1) var s2 = s1 q.enqueue(s1 + ’0’) q.enqueue(s2 + ’1’) }}generatePrintBinary(5) // => 1 10 11 100 101

到此這篇關于JS中隊列和雙端隊列實現及應用詳解的文章就介紹到這了,更多相關JS 雙端隊列 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 氢氧化钙设备, 氢氧化钙生产线-淄博惠琛工贸有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 扬子叉车厂家_升降平台_电动搬运车|堆高车-扬子仓储叉车官网 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 塑钢课桌椅、学生课桌椅、课桌椅厂家-学仕教育设备首页 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 培训中心-海南香蕉蛋糕加盟店技术翰香原中心官网总部 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 湖南自考_湖南自学考试网 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 球盟会·(中国)官方网站| 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 药品/药物稳定性试验考察箱-埃里森仪器设备(上海)有限公司 | 防水套管厂家-柔性防水套管-不锈钢|刚性防水套管-天翔管道 | 标准品网_标准品信息网_【中检计量】 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 | 定制/定做衬衫厂家/公司-衬衫订做/订制价格/费用-北京圣达信 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | SDI车窗夹力测试仪-KEMKRAFT方向盘测试仪-上海爱泽工业设备有限公司 | 凝胶成像仪,化学发光凝胶成像系统,凝胶成像分析系统-上海培清科技有限公司 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | RFID电子标签厂家-上海尼太普电子有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 安徽成考网-安徽成人高考网 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 |