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");
}
結果: