首页 > 编程语言 >学习JavaScript数据结构与算法 第五章

学习JavaScript数据结构与算法 第五章

时间:2023-05-08 19:45:50浏览次数:45  
标签:count JavaScript return 队列 items .# 第五章 lowestCount 数据结构

五,队列和双端队列

我们已经学习了栈。队列和栈非常类似,但是使用了与后进先出不同的原则。

双端队列是一种将栈的原则和队列的原则混合在一起的数据结构。

5.1 队列数据结构

队列是遵循先进先出(FIFO,也称为先来先服务)原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。

在计算机科学中,一个常见的例子就是打印队列。比如说我们需要打印五份文档。我们会打开每个文档,然后点击打印按钮。每个文档都会被发送至打印队列。第一个发送到打印队列的文档会首先被打印,以此类推,直到打印完所有文档

// @ts-check

class Queue {
  #count = 0
  #lowestCount = 0
  #items = {}
  // 向队列添加元素

  enqueue(element) {
    this.#items[this.#count] = element
    this.#count++
  }

  // 从队列移除元素
  dequeue() {
    if (this.isEmpty()) return undefined

    const result = this.#items[this.#lowestCount]
    delete this.#items[this.#lowestCount]
    this.#lowestCount++
    return result
  }

  // 查看队列头元素
  peek() {
    if (this.isEmpty()) return undefined

    return this.#items[this.#lowestCount]
  }

  // 检查队列是否为空
  isEmpty() {
    return this.size() === 0
  }

  // 获取它的长度
  size() {
    return this.#count - this.#lowestCount
  }

  // 清空队列
  clear() {
    this.#items = {}
    this.#count = 0
    this.#lowestCount = 0
  }

  // toString方法
  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
  }
}


const queue = new Queue()
console.log(queue.isEmpty())

queue.enqueue('John')
queue.enqueue('Jack')
console.log(queue)
console.log(queue.toString())


queue.enqueue('Camila')
console.log(queue.toString())
console.log(queue.size())
console.log(queue.isEmpty())

queue.dequeue()
queue.dequeue()
console.log(queue.toString())

5.2 双端队列数据结构

双端队列(deque,或称 double-ended queue)是一种允许我们同时从前端和后端添加和移除元素的特殊队列。

在计算机科学中,双端队列的一个常见应用是存储一系列的撤销操作。每当用户在软件中进行了一个操作,该操作会被存在一个双端队列中(就像在一个栈里)。当用户点击撤销按钮时,该操作会被从双端队列中弹出,表示它被从后面移除了。在进行了预先定义的一定数量的操作后,最先进行的操作会被从双端队列的前端移除。由于双端队列同时遵守了先进先出和后进先出原则,可以说它是把队列和栈相结合的一种数据结构。

class Deque {
  #count = 0
  #lowestCount = 0
  #items = {}
  // 向双端队列的前端添加元素
  addFront(element) {
    if (this.isEmpty()) {
      this.addBack(element)
    } else if (this.#lowestCount > 0) {
      this.#lowestCount--
      this.#items[this.#lowestCount] = element
    } else {
      for (let i = this.#count; i > 0; i--) {
        this.#items[i] = this.#items[i - 1]
      }
      this.#count++
      this.#lowestCount = 0
      this.#items[0] = element
    }
  }

  addBack(element) {
    this.#items[this.#count] = element
    this.#count++
  }

  isEmpty() {
    return this.#count - 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
  }

  size() {
    return this.#count - this.#lowestCount
  }

  removeFront() {
    if (this.isEmpty()) return undefined

    const result = this.#items[this.#lowestCount]
    delete this.#items[this.#lowestCount]
    this.#lowestCount++
    return result

  }
  removeBack() {
    if (this.isEmpty()) return undefined
    const result = this.#items[this.#count]
    delete this.#items[this.#count]
    this.#count--
    return result
  }

  peekFront() {
    return this.#items[this.#lowestCount]
  }

  peekBack() {
    return this.#items[this.#count]
  }

  clear(){
    this.#count = 0
    this.#lowestCount = 0
    this.#items = {}
  }

}

const deque = new Deque()
console.log(deque.isEmpty())

deque.addBack('John')
deque.addBack('Jack')
console.log(deque.toString())


deque.addBack('Camila')
console.log(deque.toString())
console.log(deque.size())

console.log(deque.isEmpty())

deque.removeFront()
console.log(deque.toString())

deque.removeBack()
console.log(deque.toString())

deque.addFront('John')
console.log(deque.toString())

5.3 使用队列和双端队列来解决问题

5.3.1 循环队列 --- 击鼓传花游戏

5.3.2 回文检查器

回文是正反都能读通的单词、词组、数或一系列字符的序列,例如 madam 或 racecar。

5.3.3 JavaScript 任务队列

标签:count,JavaScript,return,队列,items,.#,第五章,lowestCount,数据结构
From: https://www.cnblogs.com/sanhuai/p/17382922.html

相关文章

  • JavaScript
    JavaScript概述ECMAScript和JavaScript的关系1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这门语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就......
  • Javascript异步编程的4种方法
    你可能知道,Javascript语言的执行环境是"单线程"(singlethread)。所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须......
  • JavaScript: XMLHTTPRequest
     XMLHttpRequest(javascript.info)<body><script>//CreateanewXMLHTTPRequestobjectletxhr=newXMLHttpRequest()xhr.timeout=5000//timeoutinmsleturl=newURL('https://cursive.winch.io/......
  • C/C++数据结构练习题[2023-05-08]
    C/C++数据结构练习题[2023-05-08]基本习题部分1字符串距离目的:字符串是一种基础且广泛使用的数据结构,与字符串相关的题目既可以考察基本程序设计能力和技巧,也可以考查算法设计能力。题目:求字符串之间距离要求:设有字符串X,称在X的头尾及中间插入任意多个空格后构成的新字......
  • 几种常见的Python数据结构
    摘要:本文主要为大家讲解在Python开发中常见的几种数据结构。本文分享自华为云社区《Python的常见数据结构》,作者:timerring。数据结构和序列元组元组是一个固定长度,不可改变的Python序列对象。创建元组的最简单方式,是用逗号分隔一列值:In[1]:tup=4,5,6当用复杂的......
  • Python 和 JavaScript 的区别是什么?
    Python和JavaScript是两门非常流行的编程语言,它们各自有着独特的特点和应用场景。Python和JavaScript是两种不同的编程语言,它们的设计目标和应用场景有所不同。Python是一种多用途、高级、解释型的编程语言,可用于开发各种应用程序,包括Web开发、数据分析、人工智能、科学计算......
  • JavaScript原生兼容大全-持续更新
    JavaScript兼容-持续更新1.css非行内样式操作//currentStyle用于IE低版本getComputed用于主流浏览器//element目标元素attribute目标属性functiongetStyle(element,attribute){returnelement.currentStyle?element.currentStyle(attribute):getComputed(el......
  • JavaScript fromCharCode() 方法
    fromCharCode()方法返回指定的Unicode编码对应的字符。语法格式:String.fromCharCode(n1,n2,...)参数:n1,n1,..表示指定的Unicode编码。示例:(1)返回指定Unicode编码的字符:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">&......
  • 【pandas基础】--核心数据结构
    pandas中用来承载数据的两个最重要的结构分别是:Series:相当于增强版的一维数组DataFrame:相当于增强版的二维数组pandas最大的优势在于处理表格类数据,如果数据维度超过二维,一般我们会使用另一个python的库numpy。本篇主要介绍这两种核心数据结构的创建方式。1.Seriespand......
  • 《后台开发:核心技术与应用实践》第五章 核心技术与应用实践
    文章目录一、基础知识二、strace1.基础知识2.strace:跟踪系统调用来让开发者知道一个程序在后台做什么事情(1)strace基本用法(2)strace跟踪信号传递(3)统计系统调用:strace-cXXXX(5)输出到其他文件:strace-oXXX(6)每个系统调用所花费的时间:strace-TXXX(7)记录系统调用发生的时间:strace-tXX......