有效的括号

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

 有效字符串需满足:

 左括号必须用相同类型的右括号闭合。
 左括号必须以正确的顺序闭合。
 注意空字符串可被认为是有效字符串。

 示例 1:

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

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

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

 输入: "([)]"
 输出: false
 示例 5:

 输入: "{[]}"
 输出: true


    思路:如果是左括号,一律亚茹栈中,如果是右括号,判断栈顶元素是否是对应的左括号,如果不是,返回false,如果是就把
    栈顶元素出栈
 */
public class Solution7 {
    static Map<Character,Character> map=new HashMap<Character,Character>();
    static MyStack myStack=new MyStack();
    static {
        map.put('}','{');
        map.put(')','(');
        map.put(']','[');
    }
    public static void main(String[] args) {
        boolean result = isValid("()[]{}([{({[]})}])");
        System.out.println(result);


    }

    public static boolean isValid(String s) {
        if(s==null){
            return true;
        }
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char aChar = chars[i];
            if(aChar=='{'||aChar=='('||aChar=='['){
                //入栈
                myStack.add(aChar);
            }else{
                //判断栈是否为空
                boolean empty = myStack.empty();
                if(empty){
                    return  false;
                }
                //出栈
                char pop = (char) myStack.pop();
                if(pop!=map.get(aChar)){
                    return false;
                }
            }
        }

        return true;
    }

    /**
     * 自定义栈
     */
    protected static class MyStack extends Stack {
        //出栈并且返回栈顶元素
        @Override
        public synchronized Object pop() {
            return super.pop();
        }

        //入栈
        @Override
        public synchronized boolean add(Object o) {
            return super.add(o);
        }
        //判断栈是否为空
        @Override
        public boolean empty() {
            return super.empty();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值