順序隊列:
概念:
隊列是一種先進先出的線性表,只允許在一端插入,另一端刪除。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭
順序隊列的實現:
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 }