JavaScript数据结构之栈实例用法

yizhihongxing

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日

相关文章

  • Java数据结构之HashMap和HashSet

    Java数据结构之HashMap和HashSet HashMap 介绍 HashMap是一种基于哈希表实现的Map集合,它提供了快速的插入、查询、删除操作。HashMap中存储的元素是以键值对(Key-Value)的形式存储的,其中Key是用来从Map中查找值的索引,Value是存储在Map中的值。HashMap中的Key和Value都可以为null,但是在…

    数据结构 2023年5月17日
    00
  • C++实现KDTree 附完整代码

    对于“C++实现KDTree 附完整代码”的攻略,我会分为以下几个部分进行讲解: KDTree的基本概念和算法原理 KDTree的实现思路和整体代码结构 KDTree在实际应用中的应用场景 两个示例应用说明 KDTree基本概念和算法原理 KDTree全称是K-Dimensional Tree,即K维树,是一种便于高维空间数据检索的数据结构。其基本思路是对于…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之环形链表

    Java 数据结构与算法系列精讲之环形链表 概述 在本文中,我们将探讨环形链表的相关概念,以及如何使用Java语言实现环形链表的各种操作。我们将依次介绍以下几个部分: 环形链表的基本概念 环形链表的创建 环形链表的遍历 环形链表的插入、删除、查找等操作 环形链表的示例程序 环形链表的基本概念 链表是一种基本的数据结构,是由一组节点组成的序列,每个节点包含数据…

    数据结构 2023年5月17日
    00
  • 从零学JSON之JSON数据结构

    从零学JSON之JSON数据结构 什么是JSON? JSON全称为JavaScript Object Notation,即JavaScript对象表示法。它是一种轻量级的数据交换格式,具有可读性高、易于开发和解析的特点。JSON格式通常用于客户端和服务器之间的数据传输,可以支持多种编程语言。如下是一个简单的JSON格式示例: { "name&quo…

    数据结构 2023年5月17日
    00
  • 字典树的基本知识及使用C语言的相关实现

    字典树的基本知识 字典树,英文名为Trie树,又称单词查找树或键树,是一种树形数据结构,用于表示关联数组或映射。它的优点是,可以大大减少无谓的字符串比较,查询效率比哈希表高。 字典树的核心概念是节点,每个节点包含一个字符和指向子节点的指针。根节点为空字符,每个字符串以一个独立的路径插入节点。如果一个字符串是另一个字符串的前缀,那么这个字符串的节点是另一个字符…

    数据结构 2023年5月17日
    00
  • C++数据结构二叉搜索树的实现应用与分析

    C++数据结构二叉搜索树的实现应用与分析 什么是二叉搜索树? 二叉搜索树(Binary Search Tree,BST),也称二叉查找树、二叉排序树,它是一种特殊的二叉树。对于每个节点,其左子树上所有节点的值均小于等于该节点的值,右子树上所有节点的值均大于等于该节点的值。通过这种特殊的结构,二叉搜索树能够帮助我们快速地执行查找、插入、删除等操作。 如何实现二…

    数据结构 2023年5月17日
    00
  • 自制PHP框架之模型与数据库

    很好,下面我将为您详细讲解如何自制PHP框架中的模型与数据库部分。 什么是模型和数据库? 在讲解自制PHP框架的模型和数据库前,我们需要先了解什么是模型和数据库。在PHP框架架构中,模型是用来操作数据库的一种机制,用来处理对数据表的增删改查等操作,并且与数据库的连接是一定的。而数据库是一种数据存储工具,用于存储数据并提供数据操作的方法,例如数据的增删改查等。…

    数据结构 2023年5月17日
    00
  • Java矢量队列Vector使用示例

    Java矢量队列Vector使用示例 Java中的Vector是一个可调整大小的数组实现,与ArrayList类似,但是可以支持同步。在需要线程安全时,可以使用Vector代替ArrayList。 Vector的创建 使用Vector需要先导入Java.util.Vector类,然后可以使用以下代码创建一个Vector: Vector<Object&g…

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