CPU缓存对数组友好而对链表不友好
原因:CPU读取内存的时候,会把一片连续的内存块读取出来,然后放到缓存中。数组简单易用,在实现上使用的是连续的内存空间,可以借助CPU的缓存机制,预读数组中的数据,所以访问效率越高。而链表在内存中并不是连续存储,所以对CPU缓存不友好,没有办法预读。
栈应用
检查符号是否成对出现
/**
* 1、括号间的对应规则存放在 Map 中;
* 2、创建一个栈。遍历字符串,如果字符是左括号就将对应的右括号直接加入stack中,否则将stack 的栈顶元素与这个括号做比较,如果不相等就直接返回 false。遍历结束,如果stack为空,返回 true。
*/
public static boolean stackdemo(String s){
//创建栈
Stack<String> stack = new Stack<>();
//括号直接的对应规则
Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('{','}');
map.put('[',']');
//假设修正法,假设是匹配的
boolean flag = true;
//遍历字符串,拆解字符串获取字符
for (int i =0;i<s.length();i++){
//获取当前字符
char c = s.charAt(i);
//如果是左括号,把对应的右括号放入栈中
if (map.containsKey(c)){
stack.push((map.get(c).toString()));
}
//如果是有括号,与栈顶元素进行匹配
//c==')'|c==']'|c=='}'
if (map.containsValue(c)){
//字符串开头为右括号,则不对称
if (stack.empty()){
flag=false;
break;
}
//弹出栈顶元素,看是否对称
String pop = stack.pop();
if (pop.charAt(0)!=c){
flag=false;
}
}
}
//如果字符串最后为左括号,则不对称
if (!stack.empty()){
flag=false;
}
//返回flag
return flag;
}