栈----1.有效的括号

20. 有效的括号 - 力扣(LeetCode)

/**

        括号特性:

                左括号必定先出现,每个左括号都需要一个右括号与之匹配,后出现的左括号先匹配

        解法:

                依据后出现的左括号先匹配,很容易联想到栈,即后进先出

                遍历字符串,遇到左括号就在栈中添加一个对应的右括号

                遇到右括号就弹出栈顶元素判断是否一致(当前遍历到的最后一个出现的左括号是否能闭合)

            不合法:    

                若弹出的右括号与遇到的右括号不一致---> 左右类型不匹配,不合法

                若遇到右括号时栈中无元素可弹出---> 右括号多余无法闭合,不合法

                若字符串遍历结束栈中仍有元素---> 左括号多余无法闭合,不合法

*/

class Solution {
    /**
        括号特性:
                左括号必定先出现,每个左括号都需要一个右括号与之匹配,后出现的左括号先匹配
        解法:
                依据后出现的左括号先匹配,很容易联想到栈,即后进先出
                遍历字符串,遇到左括号就在栈中添加一个对应的右括号
                遇到右括号就弹出栈顶元素判断是否一致(当前遍历到的最后一个出现的左括号是否能闭合)
            不合法:    
                若弹出的右括号与遇到的右括号不一致---> 左右类型不匹配,不合法
                若遇到右括号时栈中无元素可弹出---> 右括号多余无法闭合,不合法
                若字符串遍历结束栈中仍有元素---> 左括号多余无法闭合,不合法
    */
    public boolean isValid(String s) {
        //利用双端队列模拟栈
        Deque<Character> stack = new ArrayDeque<>();

        //按规则遍历字符串
        for(char c : s.toCharArray()) {
            //将对应的右括号入栈
            if(c == '(') {
                stack.push(')');
            } else if(c == '[') {
                stack.push(']');
            } else if(c == '{') {
                stack.push('}');
            }

            //遇到右括号,判断是否合法
            else {
               
                //右括号多余或左右类型不匹配 不合法
                if(stack.isEmpty() || stack.pop() != c) {
                    return false;
                }
            }
        }

        //左括号多余
        if(!stack.isEmpty()) {
            return false;
        }

        return true;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值