栈——有效的括号
题目要求:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
这道题时栈的经典应用场景,核心思路:遇到左括号入栈,遇到右括号就匹配栈顶的左括号,最终栈为空则有效
核心逻辑讲解
- 数据结构选择:使用Deque
实现栈 - 遍历字符串:
-
遇到左括号({[:直接入栈
-
遇到右括号)}]:
如果栈为空,说明没有左括号匹配,直接返回false;
弹出栈顶元素,判断是否是同类型的左括号,不匹配则返回false
- 最终判断:遍历结束后,栈必须完全为空,才说明所有左括号都正确闭合。
边界情况覆盖
- 空字符串:有效(return true)
- 只有左括号:无效(栈不为空)
- 只有右括号:无效(栈为空时直接返回false)
- 交叉括号(如([)]):无效(匹配顺序错误)
总结
- 核心工具:栈(先进后出,完美匹配括号闭合顺序);
- 关键规则:右括号必须匹配最近的未闭合左括号;
- 最终校验:栈空 = 所有括号有效闭合。
双端队列Deque与Stack区别:
| 特点 | Stack | Deque (双端队列) |
|---|---|---|
| Java 版本 | 老版本(JDK1.0) | 新版本(推荐) |
| 线程安全 | 安全(自带锁) | 不安全(无锁,更快) |
| 功能 | 只能栈:先进后出 | 既能栈,又能队列 |
| 使用推荐 | ❌ 不推荐 | ✅ 官方强烈推荐 |
| 性能 | 慢 | 快 |
Deque
- Java里的基本类型
- char:小写,是基本数据类型,存单个字符,比如 'a'、'('、'1'。
- Character:大写,是 char 的包装类(对象类型)。
- 为什么栈里必须写Character?
Java 的集合(Deque、List、Map)不能存基本类型,只能存对象。
所以:
- 想存字符 → 不能写 Deque
- 必须写 → Deque
简单记:
char = 基本字符,Character = 可以放进栈 / 集合里的字符对象。
完整Java代码实现如下:
import java.util.Deque;
import java.util.LinkedList;
public class ValidParentheses {
public boolean isValid(String s) {
// 用双端队列实现栈,推荐使用Deque而非Stack类
Deque
// 遍历字符串中的每个字符
for (char c : s.toCharArray()) {
// 1. 遇到左括号,入栈
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
}
// 2. 遇到右括号,匹配栈顶左括号
else {
// 栈为空,说明没有对应的左括号,直接无效
if (stack.isEmpty()) {
return false;
}
// 弹出栈顶左括号,判断是否匹配
char top = stack.pop();
if ((c == ')' && top != '(') ||
(c == '}' && top != '{') ||
(c == ']' && top != '[')) {
return false;
}
}
}
// 最终栈必须为空,否则有未闭合的左括号
return stack.isEmpty();
}
// 测试代码
public static void main(String[] args) {
ValidParentheses solution = new ValidParentheses();
System.out.println(solution.isValid("()")); // true
System.out.println(solution.isValid("()[]{}")); // true
System.out.println(solution.isValid("(]")); // false
System.out.println(solution.isValid("([)]")); // false
System.out.println(solution.isValid("{[]}")); // true
}
}
浙公网安备 33010602011771号