javascript 之顺序队列(链表实现)

简介: javascript 之顺序队列(链表实现)

大家好,我是 17。

优先队列 不同,顺序队列没有特权,所有元素都是平等的,先进的先出。

代码

class Node {
  constructor(val) {
    this.val = val
    this.next = null
  }
}
class Queen {
  constructor() {
    this.length = 0
    const node = new Node()
    this.head = node
    this.tail = node
  }
  push(val) {
    const node = new Node(val)
    this.tail.next = node
    this.tail = node
    this.length++
  }
  pop() { 
    if (this.length <= 0) return undefined
    let val = this.head.next.val
    this.head = this.head.next
    this.length--
    return val
  }
  peekHead() { 
    if (this.length <= 0) return undefined
    else return this.head.next.val
  }
  peekTail(){
    if (this.length <= 0) return undefined
    else return this.tail.val
  }
}
复制代码

方法命名参照数组的命名。push 是在队尾入队元素,pop 是在队首出队元素。length 是队列的长度。我在所有相关 线性表 的方法命名上都会参考数组命名,这样的好处是不用记。

入队和出队一个元素的时间复杂度都是 O(1),这是用链表的好处。如果用数组来实现的话,出队或入队将为 O(n)。还有一种实现方式是用 hash 表的方式,用连续的数字做 key,好处是可以查询到任意位置的元素,坏处是数字可能遇到上限。

所以如果只是从队尾入,从队首出的话,链表是最好的选择。

应用

顺序队列的一个应用是缓存数据。在生产者和消费者之间建立一个缓冲,以缓解生产和消费速度不一致的矛盾。

在实际应用中,可能生产者在某段时间的能力特别强,会导致队列过大,所以还得加个限制。

class Queen {
  constructor(max = Infinity) {
    this.max = max
    this.length = 0
    const node = new Node()
    this.head = node
    this.tail = node
  }
  push(val) {
    const node = new Node(val)
    this.tail.next = node
    this.tail = node
    this.length++
    if (this.length > this.max) {
      this.pop()
    }
  }
  pop() {
    if (this.length <= 0) return undefined
    let val = this.head.next.val
    this.head = this.head.next
    this.length--
    return val
  }
  peek() {
    if (this.length <= 0) return undefined
    else return this.head.next.val
  }
}
复制代码

加上 max 参数,最大长度限度,相当于是一个保险。如果超过长度,新元素入队,老元素出队,操持最大长度。

目录
相关文章
|
7月前
|
C++
数据结构01-线性结构-链表栈队列-栈篇
数据结构01-线性结构-链表栈队列-栈篇
|
7月前
|
Python
Python实现数据结构(如:链表、栈、队列等)。
Python实现数据结构(如:链表、栈、队列等)。
283 0
|
7月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
289 0
|
4月前
|
JavaScript 前端开发
js事件队列
js事件队列
144 55
|
3月前
|
JavaScript 前端开发 API
详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务
该文章详细讲解了队列数据结构在前端开发中的应用,并深入探讨了JavaScript的事件循环机制,区分了宏任务和微任务的执行顺序及其对前端性能的影响。
|
2月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
115 64
|
22天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
43 5
|
2月前
|
存储 JavaScript 前端开发
js事件队列
【10月更文挑战第15天】
51 6
|
3月前
|
JavaScript 前端开发
js事件队列
js事件队列
29 0
|
4月前
|
JavaScript 前端开发
JavaScript——一个简单的队列Demo
JavaScript——一个简单的队列Demo
44 4