Javascript数据结构之栈和队列详解

yizhihongxing

Javascript数据结构之栈和队列详解

本文将详细讲解Javascript中常用的数据结构之一,栈和队列。

什么是栈?

栈是一种“后进先出(LIFO)”的数据结构,也就是说最后进入栈的元素被最先移除。栈一般用数组或链表实现。

栈的操作

常用的栈操作有:

  • push: 将一个元素添加到栈的顶部。
  • pop: 从栈的顶部移除一个元素,并返回它。
  • peek: 返回栈顶部的元素,但不删除它。

代码示例

下面是一个用数组实现栈的示例代码:

class Stack {
  constructor() {
    this.items = [];
  }

  push(element) {
    this.items.push(element);
  }

  pop() {
    return this.items.pop();
  }

  peek() {
    return this.items[this.items.length - 1];
  }

  isEmpty() {
    return this.items.length === 0;
  }

  size() {
    return this.items.length;
  }

  clear() {
    this.items = [];
  }
}

下面是对示例代码的解释:

  • constructor方法用来创建一个items数组。
  • push方法将一个元素添加到items数组的末尾。
  • pop方法从items数组的末尾移除一个元素,并返回它。
  • peek方法返回items数组的末尾元素。
  • isEmpty方法返回items数组是否为空。
  • size方法返回items数组的长度。
  • clear方法将items数组清空。

栈的应用

栈在计算后缀表达式、括号匹配、HTML和XML解析等方面有广泛的应用,这里就不一一展开说明。

队列

什么是队列?

队列是一种“先进先出(FIFO)”的数据结构,也就是说最先进入队列的元素被最先移除。队列一般用数组或链表实现。

队列的操作

常用的队列操作有:

  • enqueue: 将一个元素添加到队列的尾部。
  • dequeue: 从队列的头部移除一个元素,并返回它。
  • front: 返回队列头部的元素,但不删除它。

代码示例

下面是一个用数组实现队列的示例代码:

class Queue {
  constructor() {
    this.items = [];
  }

  enqueue(element) {
    this.items.push(element);
  }

  dequeue() {
    return this.items.shift();
  }

  front() {
    return this.items[0];
  }

  isEmpty() {
    return this.items.length === 0;
  }

  size() {
    return this.items.length;
  }

  clear() {
    this.items = [];
  }
}

下面是对示例代码的解释:

  • constructor方法用来创建一个items数组。
  • enqueue方法将一个元素添加到items数组的末尾。
  • dequeue方法从items数组的开头移除一个元素,并返回它。
  • front方法返回items数组的第一个元素。
  • isEmpty方法返回items数组是否为空。
  • size方法返回items数组的长度。
  • clear方法将items数组清空。

队列的应用

队列在CPU调度、消息传递、排队等方面有广泛的应用,这里也就不再一一展开。

总结

栈和队列是常见的数据结构,它们在编程中有着广泛的应用。在Javascript中,栈和队列一般用数组或链表实现。本文通过示例代码详细讲解了如何用数组实现栈和队列,并解释了它们的基本操作。

示例1:用栈来判断一个字符串中的括号是否匹配

function isBracketBalanced(str) {
  const stack = new Stack();
  for (let i = 0; i < str.length; i++) {
    const char = str.charAt(i);
    if (char === '(') {
      stack.push(char);
    } else if (char === ')') {
      if (stack.isEmpty()) {
        return false;
      } else {
        stack.pop();
      }
    }
  }
  return stack.isEmpty();
}

示例2:用队列来实现斐波那契数列

function fibonacciSeries(n) {
  const queue = new Queue();
  let fibonacci = 0;

  for (let i = 1; i <= n; i++) {
    if (i === 1 || i === 2) {
      fibonacci = 1;
    } else {
      const first = queue.dequeue();
      const second = queue.front();
      fibonacci = first + second;
    }
    queue.enqueue(fibonacci);
  }

  return queue.items;
}

希望本文对你理解栈和队列有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript数据结构之栈和队列详解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Express框架实现简单拦截器功能示例

    下面是Express框架实现简单拦截器功能示例的完整攻略。 什么是拦截器? 在软件开发中,拦截器即中间件,用于在处理请求和响应之前拦截请求,进行某些业务逻辑处理。常见的应用包括身份验证、数据验证、日志记录等。 Express框架中的拦截器功能 Express框架通过中间件来实现拦截器功能,中间件是一个函数,它可以访问请求对象(request object)、…

    node js 2023年6月8日
    00
  • 比较node.js和Deno

    下面是关于比较 Node.js 和 Deno 的完整攻略。 一、Node.js 和 Deno 简介 首先,我们要先了解一下 Node.js 和 Deno。 Node.js(以下简称 Node)是一个基于 Chrome V8 引擎的 JavaScript 运行时,能够在服务器端运行 JavaScript。Node 采用了事件驱动、非阻塞I/O 模型,使得具有良…

    node js 2023年6月8日
    00
  • Node.js使用WebAssembly

    下面是关于Node.js使用WebAssembly的文档攻略。 Node.js使用WebAssembly 什么是WebAssembly WebAssembly(简称WASM)是一种新型的编程语言,它可以在多种平台上运行,并且可以高效地执行循环密集、CPU密集型和低级别代码。WASM默认使用二进制格式,这使得它在网络传输或存储时可以大大减少体积。WASM在Ja…

    node js 2023年6月8日
    00
  • 利用NodeJS和PhantomJS抓取网站页面信息以及网站截图

    要利用 NodeJS 和 PhantomJS 抓取网站页面信息以及截图,需要经过以下步骤: 安装 NodeJS 和 PhantomJS 首先需要在本地电脑安装 NodeJS 和 PhantomJS。NodeJS 安装可以前往官网下载对应版本,PhantomJS 安装可以通过以下命令下载到本地: brew install phantomjs # 或者 npm …

    node js 2023年6月8日
    00
  • 深入理解NodeJS 多进程和集群

    深入理解 Node.js 多进程和集群攻略 本文将介绍 Node.js 多进程和集群的相关知识,包括多进程和集群的概念、实现方式和使用场景等。同时,本文将提供两个示例以更好地说明多进程和集群对 Node.js 应用的影响。 多进程和集群的概念 多进程 Node.js 中的多进程指的是利用多个进程并行处理任务。多进程对于 CPU 密集型应用十分有用,因为 No…

    node js 2023年6月8日
    00
  • Node.js API详解之 console模块用法详解

    Node.js API详解之 console模块用法详解 简介 首先,Node.jsConsole 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台。 Console 模块中提供了许多有用的方法,可以用于打印和调试 Node.js 应用程序。 安装 Node.js console 模块是默认安装的,所以您只需要导入即…

    node js 2023年6月8日
    00
  • 总结Node.js中9种fs模块文件操作方法(文件夹递归删除知识)

    总结Node.js中9种fs模块文件操作方法(文件夹递归删除知识) 文件操作是Node.js的一个重要功能。fs模块是Node.js中实现文件I/O的核心模块,提供了很多文件操作方法。本文将总结fs模块中的9种常用文件操作方法,并详细说明每种方法的用法和参数。 1. fs.stat fs.stat 方法用于获取文件/目录的基本信息,包括文件大小、创建时间、修…

    node js 2023年6月8日
    00
  • React+EggJs实现断点续传的示例代码

    下面是对实现”React+EggJs实现断点续传的示例代码”的完整攻略。 简介 断点续传是指在上传或下载大文件时,当网络连接中断或者出现其他问题时,可以保证文件的上传或下载不会从头开始,而是从中断的位置继续进行。 本文将通过React + Egg JS框架实现断点续传功能,具体实现过程会在下面的代码示例中讲解。 技术栈 前端:React 后端:Egg JS(…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部