队列和堆
先说说队列,队列就是跟排队一样,从头部出去,从尾部进来,堆的话,可以把它理解为一本书,从最顶部(也就是尾巴进去),从最顶部出去
先说说队列,学了两种实现方式,一种是数列实现方式,一种是链表
先说说数列,数列要实现队列(不管是单向还是双端)的话,有个难点就是从头部操作,一般的操作,可能就是,后排后移,然后元素加进去,这样子非常麻烦,于是就有了环形数组实现队列,有个疑问可能就是,数组是有索引的啊,但现在我们操作的并不是数组,而是队列,队列呢,我们就是只要留意它的头和尾在哪,但还有一个问题,比如你要加元素进去,然后你为了不影响后面的数组,你的head得往前走一位,这就会造成索引越界,于是有了一个重要的“魔法”:当head<0,自动穿越到最后一个索引,当尾巴>l=ength,自动穿越到第一位
public int inc(int i,int length){
if(i+1>=length){
return 0;
}else {
return i;
}
}
public int dec(int i,int length){
if (i-1<0){
return length-1;
}else return i;
}
环形数组的话,头依旧是第一位,尾巴就是没有意义,等于arr.length(最后一个索引之后哦)
接下来说说链表实现形式,链表就是相对于数组比较特殊的一种,链表实现普通队列就是简单粗暴,环形形式的话还可以多一个哨兵Node作为头和尾公用;双端的话就记得prev和next就好了其实也没什么
堆的话,既然其实也没什么差了懒得讲,其实重点就是数组那几个指针和链条的头尾