有效的括號

/**
 *  有效的括號
 給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。

 有效字符串需滿足:

 左括號必須用相同類型的右括號閉合。
 左括號必須以正確的順序閉合。
 注意空字符串可被認爲是有效字符串。

 示例 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();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章