import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
/**
* @description:20. 有效的括号
* @author: ys
* @time: 2021/12/8 21:58
*/
public class IsValid {
public static void main(String[] args) {
System.out.println(isValid("{[]}"));
}
public static boolean isValid(String s) {
Deque<Character> stack = new LinkedList<>();
Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('[',']');
map.put('{','}');
// 这种方式新增的map不仅比上面多一个class文件,而且执行速度要慢很多,并且存在生命周期的问题,不推荐使用
// Map<Character,Character> map = new HashMap(){{
// put('(',')');
// put('[',']');
// put('{','}');
// }};
// 这种方式比起toCharArray虽然不会新增额外的数组,实际测试内存消耗几乎差不多,但是遍历的速度比起直接foreach要慢很多,不推荐使用
// for (int i = 0; i < s.length(); i++) {
// char aChar = s.charAt(i);
// }
char[] chars = s.toCharArray();
for (char aChar : chars) {
if(aChar == ')' || aChar == ']' || aChar == '}'){
if (stack.isEmpty()) return false;
// 为空时,调用pop()会报异常
Character pop = stack.pop();
Character character = map.get(pop);
if(character == aChar) continue;
else return false;
} else {
stack.push(aChar);
}
}
return stack.isEmpty();
}
}
思考:这里的栈为什么用
Deque<Character> stack = new LinkedList<>();
这种形式?