前端必备数据结构:栈 (括号匹配问题)

题目描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

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

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false
示例 4:

输入:s = "([)]"
输出:false

题目来源:leetCode 20. 有效的括号

JavaScript的入栈是用数组的 push() 来模拟的;
出站是 pop() 模拟,会删除数组里出站的元素。
可以用栈的空间长度为0判断出栈是否结束。
栈的特点是 先进后出 ,出口只有栈顶。

思路是:
遇到符号的左半边都放放进去栈里,直到遇到符号的右半边开始,出栈一个对比一下与当前的字符是否成一对,不是就直接return false。

先以一组正确的为例: “()[]{}”
  1. 开始循环字符串,拿到第一个 ,属于左半边字符,放入栈:stack.push( ‘(’ )
    在这里插入图片描述

  2. 第二个字符 ,此时遇到右半边字符,我们就将栈里数据出栈。
    stack.pop() 拿到了 ( ,判断这两个字符串是一对。

  3. 第三个字符 [ , 放进栈里,stack.push(’[’):
    在这里插入图片描述

  4. 第四个字符是 ‘ ] ’, 遇到右半边的字符,所以又开始出栈 stack.pop(),
    得到 ‘[’, 判断他们两个是一对,所以继续;

  5. 第五个字符是 ‘{‘,是括号的左半边,所以入栈 ,stack.push(’ { ');
    在这里插入图片描述

  6. 第六个字符是 ‘}’, 是括号的右半边,此时将stack出栈一位,得到 '{'
    对比发现是匹配的括号,此时字符串遍历完毕,并且栈里没有剩余没有匹配的字符串,返回 true.

接下来以一组错误的为例: “([)]”
  1. 字符串开始遍历,第一位是 ’ ( ',括号类型的左半边,放入栈中,
    在这里插入图片描述
  2. 第二个字符串是 ‘ [ ’,也是左半边,继续放入栈中,
    在这里插入图片描述
  3. 第三个字符是 ’ ) ',遇到右半边就开始出栈进行对比,出栈得到 ‘ [ ’,
    发现两个字符不是一对完成的括号,即返回 false,不用后续比较了。
完整代码:
var isValid = function(s) {
    let stack = [];
    let temp= {
        '[':']',
        '(':')',
        '{':'}',
    }
    if(s.length < 2) return false
    for(let i= 0; i< s.length; i++) {
        if(![']','}',')'].includes(s[i])) {
            stack.push(s[i])
        }else if(temp[stack.pop()] !== s[i]) {
               return false
        } 
    }
    if(stack.length>0) return false
    return true
};

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那就可爱多一点点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值