一文让你快速了解JavaScript栈

  这篇文章为大家介绍(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.cloudads.cn/archives/3941.html

发表评论

登录后才能评论