问题描述
例如:输入:([]) 输出:true
一、关键思路
利用栈的入栈出栈
二、关键代码
public static boolean isValid(String s) {
//创建一个栈来存放左侧的括号
Stack<Character> sk=new Stack<>();
//遍历字符串
for(int i=0;i<s.length();i++){
//获取到字符串第i个元素,是一个字符
char c=s.charAt(i);
//遇到左括号,就要入栈
if(c== '(' || c=='{' ||c=='['){
sk.push(c);
continue;
}
//取栈顶元素和当前的括号 进行匹配
//标准库的Stack,在针对空栈进行peek就会直接抛出异常
if(sk.isEmpty()){
return false;
}
//也可以直接把if语句中pop()提出来。把peek()去掉
int ret=sk.peek();
if(c==')' && ret=='('){
//出栈
sk.pop();
continue;
}
if(c=='}' && ret=='{'){
//出栈
sk.pop();
continue;
}
if(c==']' && ret=='['){
//出栈
sk.pop();
continue;
}
// 如果没有触发到上面的三种合法情况, 此时就认为是非法情况, 就直接返回 false
return false;
}
//循环结束,说明字符串遍历结束
//还需要判定一下,栈是否为空
if(sk.isEmpty()){
return true;
}
return false;
}
public static void main(String[] args) {
String s="]";
boolean b=isValid(s);
System.out.println(b);
}
三 总结:
1.遍历字符串,返回字符串的字符,用CharAt(i),第i个元素的字符。
2.标准库的Stack,在针对空栈进行peek就会直接抛出异常。所以先判断是否为空栈。
匹配
3.pop(),出栈,会返回一个栈顶元素。