算法——Java實現隊列


順序隊列:

概念:

隊列是一種先進先出的線性表,只允許在一端插入,另一端刪除。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭

 

順序隊列的實現:

 1 import org.junit.jupiter.api.Test;
 2 
 3 /**
 4  *   順序隊列
 5  * @author wydream
 6  *
 7  */
 8 
 9 public class QueueSequence {
10 
11     private String[] arr;//隊列數組
12     private int end=0;//隊尾標志
13     
14     //向隊列中添加元素
15     public void push(String[] arr,String value) {
16         if(end<arr.length) {
17             arr[end]=value;
18             end++;
19             return;
20         }else {
21             System.out.println("隊列已經滿了");
22             return;
23         }
24         
25     }
26     
27     //取出隊列元素
28     public String pop(String[] arr) {
29         String rs;
30         if(arr[0]==null) {
31             System.out.println("隊列為空,請先向隊列中添加元素");
32             return null;
33         }else {
34             rs=arr[0];
35             arr[0]=null;
36             move(arr);
37             return rs;
38         }
39     }
40     
41     //隊列元素向前移動
42     public void move(String[] arr) {
43         for(int i=0;i<arr.length-1;i++) {
44             if(arr[i+1]!=null) {
45                 arr[i]=arr[i+1];
46             }else{
47                 arr[i]=null;
48                 break;
49             }
50         }
51     }
52     
53     
54     
55     
56     @Test
57     public void test() {
58         String[] arr=new String[10];
59         push(arr,"北京");
60         push(arr,"上海");
61         push(arr,"廣東");
62         push(arr,"杭州");
63         push(arr,"蘇州");
64         push(arr,"揚州");
65         pop(arr);
66         pop(arr);
67         pop(arr);
68         pop(arr);
69     }
70     
71 }

 

循環隊列:

 

概念:

  • 順序隊列的不足:順序隊列在進行插入操作時,直接在隊尾插入就可以,此時時間復雜度為O(1),但是在出列是在隊頭,即下標為0的位置,也就意味着隊列中所有的元素都得向前移動,此時時間復雜度為0(n),效率較低。
  • 隊列出列時不需要所有的元素都移動,引入兩個指針即可,一個頭指針front指向隊頭元素,一個尾指針rear指向隊尾元素,此時隊列出列只需移動指針即可。但是此種情況下會出現一種溢出情況(如下圖),此時隊列中任然是有空間的可以存放元素的,但是尾指針已經溢出,於是就有了循環隊列。


  •  

  • front指向隊頭,rear指向隊尾的下一個位置;隊為空的判斷:front==rear;隊為滿的判斷:(rear+1)%MAXSIZE==front

 

實現循環隊列:

 1 /**
 2  *   java實現循環隊列
 3  * @author wydream
 4  *
 5  */
 6 
 7 import org.junit.jupiter.api.Test;
 8 
 9 public class QueueArray {
10 
11     Object[] arr=new Object[10];;//對象數組,隊列最多存儲a.length-1個對象 
12     int front=0;//隊首下標
13     int rear=0;//隊尾下標
14     
15     /**
16      *  將一個對象追加到隊列尾部
17      */
18     public boolean enqueue(Object obj) {
19         if((rear+1)%arr.length==front) {
20             return false;
21         }
22         arr[rear]=obj;
23         rear=(rear+1)%arr.length;
24         return true;
25     
26     }
27     
28     //出隊列
29     public Object dequeue() {
30         if(rear==front) {
31             return null;
32         }
33         Object obj=arr[front];
34         front=(front+1)%arr.length;
35         return obj;
36     }
37     
38     @Test
39     public void test() {
40         QueueArray q=new QueueArray();
41         System.out.println(q.enqueue("北京"));
42         System.out.println(q.enqueue("上海"));
43         System.out.println(q.enqueue("廣東"));
44         System.out.println(q.enqueue("深圳"));
45         for(int i=0;i<4;i++){   
46             System.out.println(q.dequeue());   
47         }   
48     }
49     
50         
51 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM