javascript版数据结构之栈(附:leetCode 20)

171 阅读2分钟

1、概念

  栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(ps: 来源百度百科)

image.png

2、js中的栈

栈是一个后进先出的数据结构,js中没有栈,但可以用Array实现栈的所有功能。

// 创建一个数据模拟栈
const stack = [];
// 入栈
stack.push(1); // stack: [1]
stack.push(2); // stack: [1,2]
// 出栈
stack.pop() // stack: [1]
stack.pop() // stack: []

3、栈的应用场景

  • 需要后进先出的场景。
  • 比如:十进制转换为2-9的任意进制的数、判断字符串的括号是否有效、函数调用堆栈等...

比如100的八进制,100首先除以8商12余4, 4首先进栈,然后12除以8商1余4,第二个余数4进栈,接着1除以8,商0余1,第三个余数1进栈,最后将三个余数出栈,就得到了100的八进制数144。

4、leetCode

leetCode20 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
    // 判断长度是否为偶数
    if (s.length % 2 === 1) {
        return false;
    };
    // 定义一个map  key为左括号 value对应右括号
    const map = new Map()
    map.set('(', ')')
    map.set('{', '}')
    map.set('[', ']')
    // 创建一个栈
    const stack = [];
    for (let i = 0; i < s.length; i++) {
        // 获取当前括号
        const c = s[i];
        // 左括号直接入栈
        if (map.get(c)) {
            stack.push(c);
        } else { // 右括号
            // 获取栈顶的括号 (左括号)
            const l = stack[stack.length - 1];
            // 判断栈顶的括号是否与当前括号对应(左右括号是否匹配)
            if (map.get(l) === c) {
                stack.pop();
            } else {
                return false; // 不匹配即无效
            }
        }
    }
    return stack.length === 0;  // 最后栈的长度如果为0 即为有效的括号
};