前端常见数据结构与算法整理--栈

399 阅读2分钟

概念:

1.一个后进先出的数据结构
2.JavaScript中没有栈,但可以用Array模拟栈

栈.webp

概念代码实现:

const stack = []
//用数组模拟栈

stack.push(1)
//通过push推入一个数,实现入栈

stack.pop()
//通过pop弹出栈顶元素,实现出栈

哪里需要用到栈?

1.所有需要用到后进先出的场景

例:
十进制转二进制:
短除法将所有余数依次入栈,然后将得到的结果从栈顶依次出栈。每次计算余数后将所得余数存到一个栈中,由于栈先进后出的特点,在依次出栈时最先得到的余数被压在栈底,最后才被取到。

短除法.jpg

括号匹配:
由于括号分为左和右,可以把遍历的左括号入栈,然后遍历所有的右括号,然后与其中的所有左括号相匹配,匹配成功则出栈,最后栈为空时即全部匹配完成,如果最后栈内还有剩余元素,则代表还有括号没有被匹配到。
JS函数运行机制:
JS解释器是通过栈来控制函数调用的顺序,最后调用的函数最先执行完。

leetcode算法题:

20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

  1. 运用栈来存放数据。
  2. 每次检测到左括号时将其入栈,扫描到右括号时将其与当前栈顶括号匹配,如果匹配成功则将栈顶元素出栈进行下一轮匹配,如果类型不匹配则直接返回false。
  3. 所有括号便利完毕后查看栈是否为空栈,空栈则返回true,非空则为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++){
        let c = s[i]
        if(c==='(' || c==='{' || c==='['){
            stack.push(c)
        }else{
            const top = stack[stack.length-1]
            if ( 
                (top==='{' && c ==='}')||
                (top==='(' && c ===')')||
                (top==='[' && c ===']')
                ){
                    stack.pop()
                }else{
                    return false
                }
        }
    }
    return stack.length === 0
};

总结:

栈常用操作:

push(arg)
//入栈

pop()
//出栈

stack[stack.length-1]
//栈顶元素