题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
代码:
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
if (s.length() == 0) {
return true;
}
//如果输入的字符串是空的(没有任何括号),直接返回 true (空字符串说明括号匹配完了)。
Stack<Character> stack = new Stack<>();
//- Stack :
这是 Java 中一个 内置的栈类,位于 java.util 包中。使用前需要通过 import java.util.Stack; 导入。
- <Character> :
这是 泛型语法,用于指定栈中存储的元素类型。这里指定为 Character (字符类型),表示这个栈只能存储 char 类型的数据(如 'a' 、 'B' )。
创建一个栈,用来存储遍历过程中遇到的左括号( ( 、 { 、 [ )。
for (char ch : s.toCharArray()) {
// 增强形for循环
s.toCharArray() 的作用
toCharArray() 是 String 类的一个方法,它的功能是把 字符串转换为字符数组。
增强型 for 循环的语法是 for (数据类型 变量 : 数组或集合) ,它会自动遍历数组或集合中的每一个元素。
- char ch :声明一个 char 类型的变量 ch ,用于临时存储遍历到的每个字符。
- s.toCharArray() :作为被遍历的对象(即字符数组)。
if (ch == '(' || ch == '{' || ch == '[') {
stack.push(ch);
//- push :
它是栈的一个 方法,作用是将元素 “压入栈顶”。只要栈的设计允许(比如没达到容量限制),就可以不断用 push 往栈里添加元素。
代码执行效果
假设已有一个空栈 stack ,执行 stack.push(ch); 时:
- 如果 ch 是 'a' ,那么字符 'a' 会被放入栈的顶部。
- 如果后续再次执行 stack.push('b'); ,字符 'b' 会压在 'a' 上方,此时栈顶元素是 'b' 。
}else {
如果 ch 不是左括号,说明是右括号。
if (stack.isEmpty()) {
return false;
//- 在执行pop()操作前检查,避免空栈异常
} else {
char temp = stack.pop();
//temp存储的是左括号
//- pop() :
这是栈的一个方法,作用是 “弹出栈顶元素”。
后进先出
if (ch == ')') {
if (temp != '(') {
return false;
}
} else if (ch == '}') {
if (temp != '{') {
return false;
}
} else if (ch == ']') {
if (temp != '[') {
return false;
}
}
}
}
return stack.isEmpty() ? true : false;
//遍历结束后,检查栈是否为空:
- 栈空:说明所有左括号都匹配了,返回 true ;
- 栈非空:说明有未匹配的左括号,返回 false 。
}
}
}