题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。
输入:
s = "()[]{}"
输出:
true
代码实现:
java
public class Main{
public static void main(String[] args) {
String s = "[()](())";
System.out.println(isValid(s));//true
}
public static boolean isValid(String s) {
Stack<Character> stack1 = new Stack<>();//存入栈元素
Stack<Character> stack2 = new Stack<>();//存出栈元素
for (int i = 0; i < s.length(); i++) {
stack1.push(s.charAt(i));//将字符串的元素依次压入栈中
}
//依次出栈进行匹配 (),[],{}
while (!stack1.isEmpty()) {
//若栈2为空,则取栈1 栈顶元素压入
if (stack2.isEmpty()) {
stack2.push(stack1.pop());//将从栈1出栈的元素存入栈2
}
//若栈1为空,则直接跳出循环,防止空栈异常
if (stack1.isEmpty()) {
break;
}
Character c1 = stack1.peek();//获取stack1栈顶元素
Character c2 = stack2.peek();//获取stack2栈顶元素
//将两栈顶元素进行匹配
if ((c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}')) {
//若匹配成功,两栈顶元素均出栈
stack1.pop();
stack2.pop();
} else {
//如果不匹配,栈1栈顶元素出栈 并压入栈2
stack2.push(stack1.pop());
}
}
//判断栈2是否为空:若为空,则字符串全部匹配
return stack2.isEmpty();
}
}