數據結構和算法之數組實現隊列

思路

  • 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;
       }
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章