一文让你快速了解JavaScript栈

作者:拾光时间:2026-10-25 15:28:02浏览:479

本文介绍JavaScript中栈(Stack)数据结构的原理与应用。虽然JS无原生栈类型,但可利用数组的push和pop方法模拟先进后出特性。文章深入解析函数调用堆栈的工作机制,并提供判断字符串括号匹配的有效算法及代码实现,帮助开发者理解栈在算法题中的典型应用。

前言

在前面的两篇文章中,我们介绍了数据结构和算法的一些基础预备知识。从本文开始,我们将正式进入常见数据结构的学习,首要介绍的是栈(Stack)。

什么是栈?

栈,全称为堆栈,是一种遵循先进后出(LIFO)原则的数据结构。栈仅包含两种基本操作:插入和删除,分别对应入栈和出栈。栈只允许在一端进行这些操作,这一端被称为栈顶;另一端则称为栈底。下图展示了栈这种数据结构的基本形态:

前言

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()

如下图:

前言

执行过程如下:

  • 调用函数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
};

肯定还有更优的写法,这里直接使用的暴力解法。

总结

到此这篇关于一文让你快速了解JavaScript栈的文章就介绍到这了,更多相关JS 栈内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

作者最新文章