棧初體驗之有效的括號
阿新 • • 發佈:2021-02-14
技術標籤:資料結構與演算法
棧初體驗之有效的括號
1、初識棧
棧 Stack
在同一端進行插入和刪除 遵循的是先進後出/後進先出 LIFO(Last in first out)的規則
存入資料——進棧、壓棧 push
取出資料——出棧、彈棧 pop
比如:瀏覽器的回退功能 使用的就是棧
還有方法呼叫的過程 也使用了堆疊
棧是有記憶的
2、有效的括號
https://leetcode-cn.com/problems/valid-parentheses/
- 有效的括號
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。示例 1:
輸入: “()”
輸出: true示例 2:
輸入: “()[]{}”
輸出: true示例 3:
輸入: “(]”
輸出: false示例 4:
輸入: “([)]”
輸出: false示例 5:
輸入: “{[]}”
輸出: true
分析—通過棧來記錄出現的字元
方法一:
如果是右括號 尋找棧頂元素 能否進行匹配 匹配不上 無效
如果是左括號 直接壓入棧中
當遍歷完成的時候 如果不是空棧 說明有左括號未被匹配到 無效
是空棧 有效
方法二:
當出現左括號時 直接存入右括號
當出現右括號時 直接取出棧頂元素匹配
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(); } }