20. 有效的括號 - 力扣(LeetCode)
class Solution {public boolean isValid(String s) {//用map的鍵值對匹配左右括號//按照順序,先匹配的是左括號,所以棧里面放左括號HashMap<Character, Character> rlationship = new HashMap();rlationship.put(')','(');rlationship.put('}','{');rlationship.put(']','[');//用棧存放左括號,本質上是Deque雙向隊列Deque<Character> stack = new LinkedList();for (int i = 0; i<s.length(); i++){char ch = s.charAt(i);if (rlationship.containsKey(ch)){//若此時棧內為空或棧頂元素(左括號)和該右括號不匹配,則順序不對if (stack.isEmpty() || rlationship.get(ch) != stack.peek()){return false;}stack.pop();}//排除以上邏輯,右括號-pop;此時只會是左括號-pushelse{stack.push(ch);} }return stack.isEmpty();}
}
Java中雖然沒有專門的Stack
類,但可以使用Deque
接口及其實現類如LinkedList
或ArrayDeque
來實現棧的功能。Deque
接口提供了非常靈活且高效的棧操作,因此在實際應用中更為推薦。
雙端隊列(Deque)確實可以實現棧的功能,盡管棧是“先入后出”(LIFO,Last In, First Out),而隊列是“先入先出”(FIFO,First In, First Out)。這是因為雙端隊列(Deque,Double-Ended Queue)允許在其兩端進行插入和刪除操作,這使得它可以模擬棧和隊列兩種數據結構的行為。
Deque 實現棧的原理
- 棧的操作:
- push:在棧頂添加元素。
- pop:從棧頂移除元素。
- peek:獲取棧頂元素但不移除它。
在雙端隊列中,可以使用addFirst
和removeFirst
方法來模擬棧的push
和pop
操作。
- 隊列的操作:
- enqueue:在隊尾添加元素。
- dequeue:從隊頭移除元素。
在雙端隊列中,可以使用addLast
和removeFirst
方法來實現隊列的操作。