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
方法来实现队列的操作。