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

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日

相关文章

  • JavaScript手写LRU算法的示例代码

    下面是详细讲解“JavaScript手写LRU算法的示例代码”的完整攻略。 什么是LRU算法? 先来简单介绍一下LRU算法。LRU即Least Recently Used,这是一种常用的缓存淘汰策略。思想就是,如果数据最近被访问过,那么在不久的将来它被访问的几率也更高,所以就可以把最近最少使用的数据淘汰掉。 思路 手写LRU算法的话,可以使用一个Map作为存…

    node js 2023年6月8日
    00
  • JS实现返回上一页并刷新页面的方法分析

    JS实现返回上一页并刷新页面的方法分析 在 Web 开发中,有时候需要在页面跳转后返回上一页并刷新页面,这可以通过 JavaScript 来实现。针对这个需求,本文将介绍两种实现方法。 方法一:使用window.location.reload() window.location.reload() 方法可以重新加载当前页面,结合 history.go(-1) …

    node js 2023年6月8日
    00
  • Node.js 搭建后端服务器内置模块( http+url+querystring 的使用)

    下面是“Node.js 搭建后端服务器内置模块(http+url+querystring的使用)”的完整攻略。 简介 Node.js 是一个使用 JavaScript 编写的跨平台的后端程序。在 Node.js 中,内置了许多模块,包括用于搭建服务器的 http、用于解析 URL 地址的 url,以及用于解析查询字符串的 querystring 等模块。 在…

    node js 2023年6月8日
    00
  • Sequelize中用group by进行分组聚合查询

    下面我来详细讲解一下“Sequelize中用group by进行分组聚合查询”的完整攻略。 什么是group by查询? 在Sequelize中,group by查询是指将某个表按照某个字段分组,然后对每个分组进行聚合操作,比如求和、平均值等,从而得到每个分组的统计结果。 分组聚合查询的语法 在Sequelize中,我们可以使用.findAll()方法进行分…

    node js 2023年6月8日
    00
  • JavaScript模板引擎应用场景及实现原理详解

    JavaScript模板引擎是一种将模板和数据进行拼接的工具,它能够将数据和模板字符串结合起来,生成最终的HTML字符串。本文将从应用场景和实现原理两个方面进行详细讲解。 JavaScript模板引擎的应用场景 JavaScript模板引擎有广泛的应用场景,它通常用于以下几个方面: 响应式Web应用程序:JavaScript模板引擎能够根据数据的变化自动地更…

    node js 2023年6月8日
    00
  • 高吞吐、线程安全的LRU缓存详解

    高吞吐、线程安全的LRU缓存详解 本文将对一种高吞吐、线程安全的LRU缓存的实现方法进行详细讲解。 什么是LRU缓存 LRU缓存是一种最近最少使用缓存容器,通常用于存储常用的数据,避免重复计算和读取磁盘或网络等慢速数据的操作。 LRU缓存中的元素按照被使用的最近频率排序,频率最低的元素排在队列的最前面,频率最高的元素排在队列的最后面。当缓存容量满了之后,新的…

    node js 2023年6月8日
    00
  • 关于node+mysql数据库连接池连接

    我来为你讲解一下关于node.js和mysql数据库连接池连接的完整攻略。 1. 安装 mysql 模块 我们需要先安装mysql模块来连接mysql数据库,输入以下命令来安装: npm install mysql 2. 创建连接池 接下来,我们需要创建数据库连接池,并配置连接数据库的信息,如下所示: const mysql = require(‘mysql…

    node js 2023年6月8日
    00
  • 浅谈Webpack自动化构建实践指南

    概述 Webpack是一个现代化的静态模块打包器,可用于在项目中处理JavaScript,CSS及其它文件。在开发过程中,Webpack可以帮助我们自动化构建并优化代码。 本文旨在提供一个基础的Webpack自动化构建实践指南,帮助读者更好地理解Webpack的基本用法及其相关配置。 安装 在使用Webpack进行自动化构建之前,需要先安装Webpack和W…

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