class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>(); // 创建一个字符栈,用于存储括号字符
if (s.length() % 2 != 0) // 如果字符串长度为奇数,肯定不是有效的括号序列
return false;
for (int i = 0; i < s.length(); i++) {
char current = s.charAt(i); // 获取当前字符
if (current == '(' || current == '[' || current == '{') { // 如果是左括号,入栈
stack.push(current);
} else {
if (stack.isEmpty()) // 如果栈为空,没有匹配的左括号,不是有效序列
return false;
char top = stack.pop(); // 弹出栈顶的字符
if ((current == ')' && top != '(') || (current == ']' && top != '[') || (current == '}' && top != '{')) {
// 如果当前字符与栈顶字符不匹配,不是有效序列
return false;
}
}
}
return stack.isEmpty(); // 最后栈应为空,否则不是有效序列
}
}
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
har top = stack.pop();
是从栈 stack
中弹出栈顶元素,并将其存储在 top
变量中。在这种上下文中,栈是一种数据结构,遵循后进先出(LIFO)的原则,因此最后压入栈的元素最先弹出。这行代码用于从栈中取出栈顶的字符,以便进行后续的字符匹配和处理。
char
和 Character
都与字符相关,但它们有一些重要的区别:
-
数据类型:
char
是一个基本的数据类型,用于存储单个字符,它是一个原始数据类型。Character
是char
的包装类,它是一个对象,而不是原始数据类型。
-
可空性:
char
是一个原始数据类型,不支持null
值。它始终有一个有效的字符值。Character
是一个对象,可以存储一个字符或null
值,因为它是一个引用类型。
-
自动装箱和拆箱:
Character
可以通过自动装箱和拆箱与char
进行转换。这意味着你可以在需要Character
的地方使用char
,反之亦然,Java 会自动处理类型转换。
-
使用场景:
- 通常,直接使用
char
来表示单个字符,因为它更轻量且更高效。如果需要在集合类(如List
或Map
)中存储字符,并且需要支持null
值,那么可以使用Character
包装类。
- 通常,直接使用
- 总之,选择使用
char
还是Character
取决于你的需求。如果只需存储单个字符,通常使用char
更合适。如果需要处理可能为空的字符,可以使用Character
包装类。