题目描述
给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列。
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。
看到要判断括号序列不难想到此题用利用栈的特性来解。
思路:
1. 循环当前字符串,循环结束的条件:遍历完字符串
2. 每次将要push的符号与当前栈顶的符号进行对比,如果能够形成一对括号则将栈顶符号pop,如果无法形成一对合法的括号序列则讲当前符号push到栈顶
3. 循环结束后判断栈是否为空,如果为空则表示括号序列合法,否则不合法
代码及注释如下:
public static boolean isValid(String s) {
Map<Character,Character> map = new HashMap<>(); //通过Map将正确的括号映射保存,后面判断使用
map.put('(',')');
map.put('[',']');
map.put('{','}');
char[] ch = s.toCharArray();
Stack<Character> stack= new Stack<>();
for(int i=0;i<ch.length;i++){
if(stack.empty()){ //当栈为空时直接压入符号即可
stack.push(ch[i]);
}else{
if(stack.peek() == '(' || stack.peek() == '[' || stack.peek() == '{'){
if(map.get(stack.peek())== ch[i]){ //获取当前栈顶元素对应的括号 比如( 对应),如果对应的话就弹出栈顶元素
stack.pop();
}else{ //不对应就压入栈顶元素
stack.push(ch[i]);
}
}else {//如果当前栈顶元素) ] }时 ,那么该括号序列一定不合法,因为没有和它匹配的括号,直接结束程序返回false
return false;
}
}
}
if(stack.empty()){ //循环结束后栈为空,则全部匹配,此括号序列合法,反之不合法
return true;
}else{
return false;
}
}
}