java小程序之括號匹配


  括號匹配問題是棧的一個基本應用示例,輸入一個四則運算表達式,也就是一個字符串,然后循環遍歷每一個字符,處理相應的括號,判斷這個表達式的括號是不是匹配。

    思路

  1. 循環遍歷字符串,讀取字符每一個字符,記做“ch”,如果ch是左括號,則入棧;
  2. 如果ch是右括號,則:
    1. 如果棧空:說明多出右括號,返回false;
    2. 如果棧不空,ch和棧頂比較,如果不同,返回false;如果匹配,則出棧一次;
  3. 如果循環結束后棧空,則返回true,說明左括號匹配完了;
  4. 如果循環結束后棧不空,則返回false。
public class BracketMatch {
    public static void main(String[] args) {
        // 測試字符串,第一個匹配,第二個不匹配
        String inputStr1 = "{[(2+4)+(3-5)/9]*4+1}*{[(2-4)+(3-5)*9]*(4+1)}";
        String inputStr2 = "{[(2+4)+(3-5)/9]*4+1}*{[(2-4)+(3-5)*9]*(4+1}";

        System.out.println(match(inputStr1) + "..." + match(inputStr2));
    }

    public static boolean match(String inputStr) {
        int len = inputStr.length();
        LinkedList<Character> stack = new LinkedList<Character>();
        // 循環遍歷字符串
        for (int i = 0; i < len; i++) {
            // 如果是左括號則入棧
            if (isLeftBracket(inputStr.charAt(i))) {
                stack.push(inputStr.charAt(i));
                // 如果是右括號
            } else if (isRightBracket(inputStr.charAt(i))) {
                // 棧空,則右括號沒有匹配的左括號,則返回false
                if (stack.isEmpty()) {
                    return false;
                    // 棧不空,則和棧頂比較
                } else if (stack.peek().equals(inputStr.charAt(i))) {
                    return false;
                } else {
                    stack.pop();
                }
            }
        }
        // 循環結束后,棧空表示匹配完了,不空表示多余左括號
        if (stack.isEmpty()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判斷字符是不是左括號
     * 
     * @param ch
     * @return
     */
    public static boolean isLeftBracket(char ch) {
        if (ch == '(' || ch == '[' || ch == '{') {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判斷字符是不是右括號
     * 
     * @param ch
     * @return
     */
    public static boolean isRightBracket(char ch) {
        if (ch == ')' || ch == ']' || ch == '}') {
            return true;
        } else {
            return false;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM