1. 程式人生 > 其它 >棧初體驗之有效的括號

棧初體驗之有效的括號

技術標籤:資料結構與演算法

棧初體驗之有效的括號

1、初識棧

棧 Stack

在同一端進行插入和刪除 遵循的是先進後出/後進先出 LIFO(Last in first out)的規則

存入資料——進棧、壓棧 push
取出資料——出棧、彈棧 pop

比如:瀏覽器的回退功能 使用的就是棧
還有方法呼叫的過程 也使用了堆疊

棧是有記憶的

image-20200928141107287
2、有效的括號

https://leetcode-cn.com/problems/valid-parentheses/

  1. 有效的括號
    給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。

有效字串需滿足:

左括號必須用相同型別的右括號閉合。

左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。

示例 1:

輸入: “()”
輸出: true

示例 2:

輸入: “()[]{}”
輸出: true

示例 3:

輸入: “(]”
輸出: false

示例 4:

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

示例 5:

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

image-20200928141134925

分析—通過棧來記錄出現的字元

方法一:

如果是右括號 尋找棧頂元素 能否進行匹配 匹配不上 無效
如果是左括號 直接壓入棧中
當遍歷完成的時候 如果不是空棧 說明有左括號未被匹配到 無效
是空棧 有效

方法二:

當出現左括號時 直接存入右括號
當出現右括號時 直接取出棧頂元素匹配

public class ValidParenthese {

    public static void main(String[] args) {
        System.out.println(isValid1("()[]{}"));
        System.out.println(isValid1("([)]"));
        System.out.println(isValid1("()]"));
        System.out.println(isValid1("[()"));
    }


    //如果是右括號  尋找棧頂元素  能否進行匹配  匹配不上  無效
    //如果是左括號  直接壓入棧中
    //   當遍歷完成的時候  如果不是空棧  說明有左括號未被匹配到  無效
    //   是空棧   有效
    public static boolean isValid(String s) {

        // 用對映關係  記錄匹配 () [] {}
        Map<Character, Character> map = new HashMap<>();
        map.put('(', ')');
        map.put('[', ']');
        map.put('{', '}');

        Stack<Character> stack = new Stack<>();
        char[] arr = s.toCharArray();
        for (char c : arr) {
            if (map.containsKey(c)) {
                // 左括號
                stack.push(c);
            } else {
                // 右括號
                if (stack.empty()) {
                    System.out.println("右括號出現  但左括號仍未出現");
                    return false;
                }

                // 取出棧頂元素
                char top = stack.peek();
                if (!map.get(top).equals(c)) {
                    System.out.println("右括號出現  但不是與之對應的左括號");
                    return false;
                }

                // 彈出 左括號  已被抵消
                stack.pop();
            }
        }
        if (!stack.empty()) {
            System.out.println("左括號出現  但右括號仍未出現");
            return false;
        }

        return true;

    }


    // 當出現左括號時   直接存入右括號
    // 當出現右括號時   直接取出棧頂元素匹配
    public static boolean isValid1(String s) {

        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(') {
                stack.push(')');
            } else if (c == '[') {
                stack.push(']');
            } else if (c == '{') {
                stack.push('}');
            } else if (stack.empty() || c != stack.pop()) {
                return false;
            }
        }

        return stack.empty();
    }
}