栈的特点是只能在栈顶操作,从栈顶出,从栈顶入,早进晚出。
假设给定一组括号且是正常的顺序时,如果从左向右开始遍历,那么越早遍历到的左括号越晚找到与之对应的右括号,这在一定程度上是符合栈早进晚出的特点的。
那么我们要解决的就是括号什么时候入栈,什么时候出栈的问题。
步骤:
1.如果我们遇到的是左括号,那么我们就将它入栈,等待与之对应的右括号。
2.如果我们遇到的是右括号,先判断一下此时栈是否为空,若为空,返回false;
若不为空,将栈顶元素出栈,判断与右括号是否匹配。
3.以上操作可以保证每个右括号对应的是正确的左括号,但是如果在开头或结尾多出来一个左括号时,是不会被发现的。所以,我们还需要对循环结束后的栈进行判空操作,加入括号有效,则循环结束后的栈应该是空的,
class Solution {
public boolean isValid(String s) {
Stack<Character> stack=new Stack<Character>();
for(char c:s.toCharArray()){//把s的每一个字符都赋给c
if(c=='['||c=='('||c=='{'){//如果是左括号就入栈
stack.push(c);
}else{
if(!stack.empty()){//判空,若不为空
if(c==')'){
if(stack.pop()!='(') {//从栈顶POP,不能指定POP对象,通过判断pop与正确符号比较判断
return false;
}
}
if(c==']'){
if(stack.pop()!='['){
return false;
}
}
if(c=='}'){
if(stack.pop()!='{'){
return false;
}
}
}else {//若遇到的是右括号且栈为空时
return false;
}
}
}
return stack.isEmpty();//当括号有效的时候,结束时栈为空
}
}