JavaScript数据结构之栈实例用法

JavaScript数据结构之栈实例用法

本文将会介绍栈在JavaScript中的实例用法以及栈作为一种数据结构的基本概念。

栈的定义

栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端称作栈底,不含任何元素的栈称为空栈

栈的应用场景

栈其应用场景是非常广泛的。在现实世界中,许多普通的场景都可以使用栈作为一个基本数据结构来解决。比如:

  • 撤销、恢复操作
  • 浏览器历史记录
  • 实现编译器中的语法分析等

JavaScript中栈的实现

JavaScript是一种可以动态扩展数组的语言,因此我们可以使用数组来实现栈。在JavaScript中,我们可以使用以下方式来实现一个栈:

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 = []
  }
}

我们可以使用es6的class语法来创建一个stack类,其中此类主要有以下方法:

  • push:添加一个元素到栈顶
  • pop:移除栈顶的元素并返回该元素
  • peek:返回栈顶的元素,但不移除它
  • isEmpty:如果栈里没有任何元素就返回true,否则返回false
  • size:返回栈里的元素个数
  • clear:移除栈里的所有元素

栈的实例用法

示例1:括号匹配

在括号匹配的场景中,将所有的左括号(如“(”、“{”、“[”等)入栈,当我们遇到右括号(如“)”、“}”、“]”等)时,我们将会从栈中弹出相应的左括号,并检查两者是否匹配。如果这两个括号不匹配,那么我们就发现了一个不正确的字符串。

以下是使用stack类来实现的代码:

function isBracketMatching(str) {
  const stack = new Stack();

  for (let i = 0; i < str.length; i++) {
    const bracket = str.charAt(i);

    if (bracket === '(' || bracket === '{' || bracket === '[') {
      stack.push(bracket);
    } else if (bracket === ')' && stack.peek() === '(') {
      stack.pop();
    } else if (bracket === '}' && stack.peek() === '{') {
      stack.pop();
    } else if (bracket === ']' && stack.peek() === '[') {
      stack.pop();
    } else {
      return false;
    }
  }

  return stack.isEmpty();
}

console.log(isBracketMatching('(()){}[[]]')); // true
console.log(isBracketMatching('([)])')); // false
console.log(isBracketMatching('(((((((')); // false

以上面的代码为例,我们先定义了一个isBracketMatching函数,该函数接受一个字符串参数,判断该字符串中的括号是否匹配。我们创建一个新的stack对象,然后开始迭代这个字符串中的每一个字符。如果这个字符是一个左括号,我们把它放在栈顶。如果这个字符是一个右括号,我们将会检查栈顶元素是否匹配。如果匹配,我们就弹出栈顶元素。最后,如果所有的括号都已被匹配,那么栈里的元素将会全部被弹出,函数就会返回true。

示例2:进制转换

进制转换也是栈的经典应用场景之一。假设我们需要把一个数字从十进制转换成二进制。我们可以使用以下算法来实现:

function decimalToBinary(decimalNum) {
  const stack = new Stack();
  let binaryStr = '';

  while (decimalNum > 0) {
    const binaryDigit = decimalNum % 2;
    decimalNum = Math.floor(decimalNum / 2);
    stack.push(binaryDigit);
  }

  while (!stack.isEmpty()) {
    binaryStr += stack.pop().toString();
  }

  return binaryStr;
}

console.log(decimalToBinary(10)); // 1010
console.log(decimalToBinary(100)); // 1100100
console.log(decimalToBinary(1000)); // 1111101000

我们定义了一个名为decimalToBinary的函数,它接受一个十进制数字作为参数,然后使用乘以2和取余数的方式来计算这个数字的二进制表示。然后,我们可以将每一个计算得到的0或1入栈,直到数字变成了0为止。最后,我们弹出栈中得到的每一个0或1,将它们组合成一个字符串,这就是这个数字的二进制表示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript数据结构之栈实例用法 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 详解python数据结构之队列Queue

    详解Python数据结构之队列 (Queue) 在计算机科学中,队列(Queue)是一种数据结构,可以用于按顺序存储和访问元素。该数据结构遵循先进先出(FIFO)原则,人们可以从队列的前面插入元素,从队列的后面删除元素。Python内置了队列模块(queue),这个模块实现了多线程安全队列、同步机制及相关数据结构。Queue模块提供了三种队列类型: FIFO…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之选择排序示例详解

    Go语言数据结构之选择排序示例详解 什么是选择排序? 选择排序是一种简单的排序算法,它的基本思想是在待排序的数列中选择一个最小(或最大)的元素放到最前面,再在剩下的数列中选择一个最小(或最大)的元素放到已排序序列的末尾,以此类推,直到所有的元素都排序完毕。 其排序的时间复杂度为O(N²),在数据量较小的情况下使用起来非常方便。 选择排序的实现 下面我们来看一…

    数据结构 2023年5月17日
    00
  • SQL Injection with MySQL 注入分析

    SQL Injection (SQL注入)是一种常见的网络攻击技术,攻击者通过输入一定格式的恶意SQL语句,利用程序没有对用户输入进行校验或者过滤的漏洞,来获取数据库中的数据或者执行非授权的操作。本文将针对MySQL数据库漏洞进行讲解,介绍常见的攻击方法和防御策略。 SQL Injection with MySQL 注入分析 攻击方法 错误的输入验证 攻击者…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之时间空间复杂度入门

    C语言数据结构与算法之时间空间复杂度入门攻略 1. 什么是时间复杂度和空间复杂度? 在进行算法设计时,我们不仅需要考虑到算法的正确性,还要考虑到算法的执行效率。而衡量算法执行效率的指标主要有两个,即时间复杂度和空间复杂度: 时间复杂度:衡量算法所需时间的度量,通常用“大O”符号来表示。比如,对于n个元素的数组,某些算法需要执行n次操作,这个算法的时间复杂度就…

    数据结构 2023年5月16日
    00
  • Java数据结构之栈与队列实例详解

    Java数据结构之栈与队列实例详解攻略 简介 栈和队列是常见的数据结构,在Java中也有对应的实现方式。本文将介绍栈和队列的概念、常见实现方式、应用场景和两个示例。 栈 概念 栈是一种具有后进先出(Last In First Out)特性的数据结构。栈可以使用数组或链表实现。 常见实现方式 基于数组的栈实现 使用数组作为底层存储结构实现栈时,需要注意栈顶指针…

    数据结构 2023年5月17日
    00
  • C语言数据结构之简易计算器

    C语言数据结构之简易计算器攻略 简介 这是一个基于C语言的简易计算器,可以实现加、减、乘、除四个基本运算。 实现步骤 首先,需要声明四个变量,分别表示运算符、被加数、被减数、被乘数和被除数。 char op; double n1, n2, result; 然后,需要通过scanf()函数获取用户输入的运算符和数字。 printf(“请输入运算符和数字:\n”…

    数据结构 2023年5月17日
    00
  • Lua教程(七):数据结构详解

    Lua教程(七):数据结构详解 Lua 中的数据结构广泛应用于各种计算机程序中。本文将详细介绍 Lua 中的数组、列表、栈、队列、集合和字典等数据结构的使用以及相关的函数。 数组 数组是存储在连续内存位置上的相同数据类型的元素集合。Lua 中的数组索引默认从 1 开始。下面是一些常用的 Lua 数组函数: table.concat(arr[, sep[, i…

    数据结构 2023年5月17日
    00
  • LCA——ST表+欧拉序

    了解到一个quan新的东西: 用ST表(欧拉序)实现LCA(树上最近公共祖先) 欧拉序 前序遍历得到的序列,叫dfs序但数字可以重复出现,一进一出,叫欧拉序会发现根结点总在中间而根结点是该段序列深度最小的点因此两个点的LCA,就是在该序列上两个点第一次出现的区间内深度最小的那个点 即转化为区间RMQ问题,可以用ST表当然你可以再写一棵线段树(如果有修改操作)…

    算法与数据结构 2023年5月4日
    00
合作推广
合作推广
分享本页
返回顶部