Java 用棧解決括號匹配問題
阿新 • • 發佈:2019-02-19
在南陽理工ACM看到的一道題
問題描述:問題描述 : 輸入一個字串 裡面只含有 [ , ] , ( , ) 四種括號 ; 現要求判斷這個字串 是否滿足括號匹配
如 ([])() 是匹配的 ([)]是不匹配的
先貼程式碼
public void check(String str) { Stack<Character> stack = new Stack<Character>(); // 如果該String長度為奇數,不匹配 if (str.length() % 2 == 1) { System.out.println("No"); } else { stack = new Stack<Character>(); for (int i = 0; i < str.length(); i++) { if (stack.isEmpty()) { stack.push(str.charAt(i)); // 當前棧是空的 存入當前位置的字元 } else if ((stack.peek() == '[' && str.charAt(i) == ']') || (stack.peek() == '(' && str.charAt(i) == ')')) { stack.pop(); // 滿足上面的條件 表示相鄰的兩個字元是一對匹配的括號 進行出棧操作 } else { stack.push(str.charAt(i)); } } if (stack.isEmpty()) { System.out.println("Yes"); } else { System.out.println("No"); } } }
先說Stack - 棧 特點是後進先出 其中 push() 將一個物件寫入棧頂
peek() 方法返回棧頂物件且不將其出棧
pop() 返回棧頂物件並將其出棧
演算法描述 : 先判斷字串長度 為奇數一定不匹配 方法結束
為偶數用for迴圈遍歷字串每個字元 棧為空將當前字元入棧 做下一次迴圈
棧不為空做比較 如果當前棧頂和當前位置字元是匹配的一對括號 pop方法出棧 不匹配當前字元就入棧
迴圈結束棧為空 表示滿足括號匹配
出棧的過程就是一次匹配的過程如果最後棧不為空 表示一定有括號沒匹配