1.实现思路如图16-1所示
图16-1:
当然,这种实现办法有好处也有坏处。
坏处是,数组原先的资源没有被释放,留着占内存。
另外,如果使用固定长度的数组,那么很容易就会满数组,从而爆出指针超过边界的文图
优化方式见图16-2
好处是,入队和出队的时间复杂度是o(1)
图16-2:
对于图2的方法,可以节省了空间的开销,但是,对于出队的操作时间复杂度则是o(n)。
这种写法其实不是很好
以下是图16-1的实现代码:
public interface IQueue<T> {
void enQueue(Element<T> element);
Element<T> deQueue();
int len();
}
public class TQueue<T> implements IQueue<T> {
DynamicArray<Element<T>> list;
public int head;
public int end;
private int len;
public TQueue(){
//见该系列第14章
list = new DynamicArray<>(20);
}
@Override
public void enQueue(Element<T> element) {
list.change(end,element);
end++;
len++;
}
@Override
public Element<T> deQueue() {
if (len<=0){
Debug.Log("队列为空");
return null;
}
Element el = list.get(head);
head++;
len--;
return el;
}
@Override
public int len() {
return len;
}
}
以下是图16-2的实现代码
就是多了个前移的操作
public class TQueue2<T> extends TQueue<T> {
@Override
public Element<T> deQueue() {
Element head = getList().get(0);
for (int i = 1;i<len();i++){
getList().change(i-1,getList().get(i));
}
setLen(len()-1);
return head;
}
}
测试代码:
public static void main(String[] args) throws IOException {
TQueue2<Integer> tQueue = new TQueue2<>();
for (int i =0;i<100;i++){
tQueue.enQueue(new TElement<>(i));
}
while (tQueue.len()!= 0){
System.out.println(tQueue.deQueue().getValue()+"<长度:>"+tQueue.len());
}
System.out.println("\n");
}
结果: