
思路:
1. 利用栈先进后出的特性,将string中的元素放于栈中
3. 若是一个合理的开闭集合元素,则闭元素和开元素为同一个类型
4. 在栈中只放入开元素,在栈顶上应该为最后一个放入的元素。
5. 所以string的第一个闭元素应该和栈顶最后一个开元素配套。
6. 若栈顶没有元素,则返回一个虚拟值代替
7. 若栈顶值和string的第一个闭元素不配套,则返回false;
8. 遍历到闭元素,就比较栈顶的开元素
9. 若最后栈中没有元素了,则说明所有开闭元素配套
public boolean isValid(String s) {
//新建一个栈,用于存放所有的开元素
Stack<Character> stack = new Stack();
//新建一个map,用于判断开闭元素是不是一个类型
Map<Character, Character> map = new HashMap();
map.put(')','(');
map.put(']', '[');
map.put('}','{');
//遍历string中的每个字符
for(int i = 0; i< s.length(); i++){
//c为当前字符
char c = s.charAt(i);
//若c是一个闭元素
if(map.containsKey(c)){
//查找其对应的开元素
char open = map.get(c);
//判断栈顶是不是有元素,若有则弹出栈顶元素,若没有赋给pop一个虚拟值
char pop = stack.isEmpty() ? 'E' :stack.pop();
//比较对应的开元素是不是就是栈顶元素
if(open != pop){
//若不是,则该string不成立
return false;
}
}else{
//若c不是一个闭元素,则为开元素,将其放入栈中
stack.push(c);
}
}
//若为一个合理的String,则栈中应该没有元素
return stack.isEmpty();
}