栈——有效的括号

题目要求:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

这道题时的经典应用场景,核心思路:遇到左括号入栈,遇到右括号就匹配栈顶的左括号,最终栈为空则有效

核心逻辑讲解

  1. 数据结构选择:使用Deque实现栈
  2. 遍历字符串
  • 遇到左括号({[:直接入栈

  • 遇到右括号)}]:
    如果栈为空,说明没有左括号匹配,直接返回false;
    弹出栈顶元素,判断是否是同类型的左括号,不匹配则返回false

  1. 最终判断:遍历结束后,栈必须完全为空,才说明所有左括号都正确闭合。

边界情况覆盖

  • 空字符串:有效(return true)
  • 只有左括号:无效(栈不为空)
  • 只有右括号:无效(栈为空时直接返回false)
  • 交叉括号(如([)]):无效(匹配顺序错误)

总结

  1. 核心工具:(先进后出,完美匹配括号闭合顺序);
  2. 关键规则:右括号必须匹配最近的未闭合左括号;
  3. 最终校验:栈空 = 所有括号有效闭合。

双端队列Deque与Stack区别:

特点 Stack Deque (双端队列)
Java 版本 老版本(JDK1.0) 新版本(推荐)
线程安全 安全(自带锁) 不安全(无锁,更快)
功能 只能栈:先进后出 既能栈,又能队列
使用推荐 ❌ 不推荐 ✅ 官方强烈推荐
性能

Deque中的Character是什么意思?

  1. Java里的基本类型
  • char:小写,是基本数据类型,存单个字符,比如 'a'、'('、'1'。
  • Character:大写,是 char 的包装类(对象类型)。
  1. 为什么栈里必须写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 stack = new LinkedList<>();

// 遍历字符串中的每个字符
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
}
}

posted @ 2026-05-07 09:07  ZealousMclaren  阅读(2)  评论(0)    收藏  举报