资讯专栏INFORMATION COLUMN

一文让你快速了解JavaScript栈

3403771864 / 7人阅读

  这篇文章为大家介绍(Stack)。

  什么是栈?

  栈全称为堆栈,简单来说就一种数据,特点是先进后出。在栈中只有两种基本操作,插入-入栈删除-出站,记住栈只有一端可以进行入栈和出栈操作,我们将其称为栈顶,另一端称其为栈底;如下图展示了栈这个数据结构:

1.png

  JavaScript中的栈

  其实JavaScript的栈并没有数据类型,需要数组进行模拟,其中要知道的就是提供的push()和pop()选项,这样也正好符合栈的特点,

  示例代码如下:

  const stack = []
  // 入栈
  stack.push(1)
  stack.push(2)
  // 出栈
  const v1 = stack.pop() // 2
  const v2 = stack.pop() // 1

  栈的应用场景

  其实栈是算法和程序中最常用的辅助结构,先进后出场景中我们都可以见到栈的身影,比如:

  函数调用堆栈

  判断字符串括号是否有效

  接下来我们依次来看:

  函数调用堆栈

  JavaScript中的函数调用堆栈就是一个应用栈的一个典型例子,比如下面这段代码:

  function f1() {}
  function f2() {
  f1()
  }
  function f3() {
  f2()
  }
  f3()

  如下图:

2.png

  执行过程如下:

  调用函数f3(),将f3压入堆栈;

  在f3()中调用了f2(),将f2压入堆栈;

  在f2()中又调用了f1(),将f1压入堆栈;

  只有f1()运行完成才能继续往下执行,所以f1()先出栈,以此类推。

  有效的括号

  有效的括号是力扣中的一个关于栈的算法题目,题目大意就是判断给定字符串中的括号是否匹配,匹配返回true,否则返回false。

  解题思路如下:

  判断字符串主要是判断长度是否偶数,当时奇数时直接返回false,实现这主要是括号都是成对出现的;

  新建一个栈;

  遍历字符串,遍历到每一项时如果时左括号,将其压入栈;如果是右括号,与栈顶对比,如果相匹配则出栈,不匹配则返回false。

  实现代码如下:

  /**
  * @param {string} s
  * @return {boolean}
  */
  var isValid = function(s) {
  if (s.length % 2 !== 0) return false
  const stack = []
  for(let i = 0; i<s.length; i++) {
  const c = s[i] // 记录当前项
  if (c === '(' || c === '[' || c==='{') {
  stack.push(c)
  } else {
  const t = stack[stack.length - 1] // 获取栈顶元素
  if (
  (t === '(' && c === ')') ||
  (t === '[' && c === ']') ||
  (t === '{' && c === '}')
  ) {
  stack.pop()
  } else {
  return false
  }
  }
  }
  // 如果为0表示全部匹配,有剩余则表示不匹配
  return stack.length === 0
  };

  这里些的代码虽然看起来简单粗暴,但也非常实用。


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/127818.html

相关文章

  • 一文让你明白CPU上下文切换

    我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。 而在每...

    paulquei 评论0 收藏0
  • 开始测试从了解产品技术开始

    ...我们发现不同于Wappalyzer。 它列举了除了产品的web框架,javascript框架外,同时还列出了文本的编码,文本里使用的标准,也将相应技术的相关链接也展示在插件中。 3.最后使用下Whatruns,它和Wappalyzer很类似,不过不同于前者,它...

    Coly 评论0 收藏0
  • 「码个蛋」2017年200篇精选干货集合

    ...pp组件化与业务拆分那些事 采用Gson解析含有多种JsonObject 一文让你明白Java字节码 深入理解Java类加载机制 你知道Thread线程是如何运作的吗? Android开发之Handler的前世今生 Android:深入剖析 Retrofit 2.0 源码 AsyncTask? AsyncTask串行and并...

    wangtdgoodluck 评论0 收藏0
  • Java相关

    ...内存分配 关于 JVM 堆内存分配的一些原理。 集合番@HashMap一文通(1.7版) 集合番@HashMap一文通(1.7版) Dagger2神器入门(三) Dagger2神器入门(三) java 集合类基础和延伸 java 集合类基础和延伸,集合之间的对比和 Java8 的一些改...

    wangtdgoodluck 评论0 收藏0
  • 一文让你彻底理解 Java NIO 核心组件

    同步、异步、阻塞、非阻塞首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]。 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节)。 异步:相对于同步,API调用返回时调...

    guyan0319 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<