分享

如何使用栈更好的解决括号匹配问题???

 昵称70680357 2020-07-02

一,问题描述

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
!!!注意空字符串可被认为是有效字符串。
示例 1:

输入: “()”
输出: true

示例2.

输入: “(]”
输出: false

示例3:

语言 方法
4020 568P7x4Cy4
DLrho 赚钱方式大全
5274 2010/01/11 06:38:32

输入: “([)]”
输出: false

示例4:

输入: “{[]}”
输出: true

二,解决思路

1.调用Map接口实现创建Map实例放入(括号)键值对作为后序判定
2,创建一个栈
3,遍历字符串,逐个取出字符

        3.1遍历过程中如果为左括号就入栈
        3.2如果为右括号,就取出栈顶元素查表对比是否与右括号相同

4.遍历结束,栈为空,且之前没有返回false,就认为所有括号匹配
(具体流程也可参考代码注释)

三,代码实现

public static boolean isValid(String str){
    Map<Character,Character> map = new HashMap<>();
    map.put('(',')');
    map.put('{','}');
    map.put('[',']');
    //先创建一个栈
    Stack<Character> stack = new Stack<>();
    //循环遍历每个字符
    for(int i = 0; i < str.length(); i++  ){
        char rec = str.charAt(i);
        //取出当前字符,如果为右括号就入栈
        if(rec == '(' || rec == '[' || rec == '{'){
            stack.push(rec);
            continue; //返回继续判断是否需要入栈
        }
        //判断rec为右括号即取出栈顶元素
        if(stack.empty()){
            //如果发现当前字符不是左括号,并且栈为空,说明当前字符违法
            //这种情况说明没有合适的左括号与当前括号匹配
            return false;
        }
        char top = stack.pop();
        //判断c是否为右括号,如果是就取出栈顶元素top与rec比较
       if(map.get(top) == rec ){
           continue;
       }
        return false;
    }
    if(stack.empty()){ //最后栈为空即所有括号都匹配成功
        return true;
    }
    return false;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多