思路
- 1、利用雙指針分別指向頭結點和尾結點來控制先進先出的特性。
- 2、每次出隊操作,將後面的數據向前移一位,來解決頭和尾指針向後移動以至於不能插入新數據的問題,但是時間複雜度比較高,出隊時間複雜度會由O(1) 變爲 O(n),不建議採用。
- 3、每次入隊操作,判斷如果尾結點達到數組最後面,就把頭結點和尾節點所有數據移動到數組最前面。時間複雜度還是O(1) 。
直接上代碼,自已已經親測過:
/**
* 數組實現隊列
* Author : BlueSky 2019.11.01
* 思路:
* 1、利用雙指針分別指向頭結點和尾結點來控制先進先出的特性。
* 2、每次出隊操作,將後面的數據向前移一位,來解決頭和尾指針向後移動以至於不能插入新數據的問題,但是時間複雜度比較高,出隊時間複雜度會由O(1) 變爲 O(n),不建議採用。
* 3、每次入隊操作,判斷如果尾結點達到數組最後面,就把頭結點和尾節點所有數據移動到數組最前面。時間複雜度還是O(1) 。
*/
public class ArrayQueueMain {
public static void main(String[] args) {
ArrayQueue arrayQueue = new ArrayQueue(6);
Boolean flag1 = arrayQueue.addV2("1");
Boolean flag2 = arrayQueue.addV2("2");
Boolean flag3 = arrayQueue.addV2("3");
Boolean flag4 = arrayQueue.addV2("4");
Boolean flag5 = arrayQueue.addV2("5");
System.out.println("add res:" +flag1 +"," +flag2 +","+flag3 +","+flag4 +","+flag5 +";");
// 移動頭指針
String poll1 = arrayQueue.poll();
String poll2 = arrayQueue.poll();
System.out.println("poll res:" +poll1 +"," + poll2 + ";");
Boolean flag6 = arrayQueue.addV2("6");
// 數據遷移
Boolean flag7 = arrayQueue.addV2("7");
Boolean flag8 = arrayQueue.addV2("8");
Boolean flag9 = arrayQueue.addV2("9");
Boolean flag10 = arrayQueue.addV2("10");
System.out.println("add res:" +flag6 +"," +flag7 +","+flag8 +","+flag9 +","+flag10 +";");
}
public static class ArrayQueue{
/**
* 數組
*/
private String[] array;
/**
* 容量
*/
private Integer capacity;
/**
* 頭指針
*/
private Integer head = 0;
/**
* 尾指針
*/
private Integer tail = 0;
public ArrayQueue(Integer n){
array = new String[n];
capacity = n;
}
/**
* 入隊V1
*/
public Boolean addV1(String data){
// 如果尾節點等於容量,相當於滿了
if(tail.equals(capacity)){
return false;
}
array[tail] = data;
++tail;
return true;
}
/**
* 入隊V2
*/
public Boolean addV2(String data){
System.out.println("head:" + head);
System.out.println("tail:" + tail);
// 如果尾節點等於容量就需要做遷移操作
if(tail.equals(capacity)){
// 如果頭結點還在第一個位置說明隊列已滿
if(head == 0){
System.out.println("queue is full");
return false;
}
// 數據遷移
System.out.println("data move");
for(int i = 0; i< tail - head; i++){
array[i] = array[head + i];
}
// 遷移後需要將指針復位
tail = capacity - head;
head = 0;
System.out.println("move after tail:" + tail);
// 打印
for(int i = 0; i< capacity; i++){
System.out.println("move after print array:" + array[i]);
}
}
array[tail] = data;
++tail;
for(int i = 0; i< capacity; i++){
System.out.println("print array:" + array[i]);
}
return true;
}
/**
* 出隊
*/
public String poll() {
if(head.equals(tail)){
return null;
}
String res = array[head];
++head;
return res;
}
}
}