检查字符串中的括号是否匹配

题目描述:

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断该字符串是否有效。
有效字符串需满足:
a左括号必须用相同类型的右括号闭合。
b左括号必须以正确的顺序闭合。
比如: "()"、"()[]{}"、"{[]}" 都是有效字符串,而 "(]" 、"([)]" 则不是。

解题思路:

根据题目描述可以知道,在遍历字符串的过程中,第一个遇到的一定是左括号,后续元素有两种可能:

a:还是左括号

b:与已遍历元素相匹配的右括号

那么只需要在遍历过程中,将左括号存放到栈中,并判断遍历到的右括号是否与当前栈顶元素相匹配,若匹配则该栈顶弹出,否则继续遍历。

而判断是否匹配的过程,即为判断当前括号是否和栈顶元素对应,因此可以将括号的对应规则存入Map集合,令左括号为键,右括号为值,每一次遇到右括号的判断,都是判断当前左括号在Map集合中对应的值是否与遍历到的右括号相等。

举个例子:{( [ ] )}

上述字符串是一个有效字符串

在遍历过程中 左括号{ (   [  依次入栈,此时栈顶元素为  [ 

 继续遍历,]为右括号,此时,需要判断栈中是否有元素,若栈中没有元素,说明该右括号为单独的的右括号,匹配失败, 若有元素,判断该括号与栈顶是否匹配,若匹配,故栈顶元素  [  弹出

 继续遍历直至字符串遍历结束,栈顶左括号全部弹出,循环结束,匹配成功。否则失败

判断函数

 public static boolean check(Map<Character,Character> map,String str){
        Set<Character> keys=map.keySet();
        Stack<Character> stack = new Stack<>();
        for(int i=0,len=str.length();i<len;i++){
            //若为左括号则压栈
            if(str.charAt(i)=='('||str.charAt(i)=='{'||str.charAt(i)=='['){
                stack.push(str.charAt(i));
            }else{
                /*若为右括号,则判断是否匹配
                *此时需要判断当前栈是否为空栈,这是因为遍历还在继续。如果是空栈则说明,有单独的右括号,返回false
                * 若不是空栈,则与map集合中的规则进行比较,当该元素是栈顶所匹配的右括号时,栈顶弹出,继续向后遍历
                * */
                if(stack.size()>0){
                    if (str.charAt(i)==map.get(stack.peek())){
                        stack.pop();
                    }
                }else{
                   return false;
                }
            }
        }
        //遍历结束,栈为空,表示所有左括号都匹配成功并弹出,返回true
        if (stack.size()==0)
            return true;
        return false;
    }

主函数

public static void main(String[] args) {
        Map<Character, Character> map = new HashMap<>();
        map.put('(',')'); map.put('{','}'); map.put('[',']');
        String str="({})[]()}";
        System.out.println(check(map, str));
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Gurean

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

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

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

打赏作者

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

抵扣说明:

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

余额充值