1. 程式人生 > 資訊 >眾籌價 309 元,小米中樞閘道器正式釋出:全新本地中樞架構,可連線百款裝置

眾籌價 309 元,小米中樞閘道器正式釋出:全新本地中樞架構,可連線百款裝置

思路:

  1、front變數:指向佇列的第一個元素,arr[front]就是佇列的第一個元素

    front=0

  2、rear變數:rear指向佇列的最後一個元素的後一個位置,空出一個空間做約定

    rear=0

  3、當佇列滿時,條件是(rear+1)%maxSize = front [滿]

  4、對佇列為空的條件,rear == front 空

  5、當我們這樣分析,佇列中有效的資料個數 (rear+maxSize -front) % maxSize 

  1 import java.util.Scanner;
  2 
  3 public class CircleArrayQueue {
4 public static void main(String[] args) { 5 //測試 6 CircleQueue queue = new CircleQueue(4); 7 char key = ' ';//接收使用者輸入 8 Scanner scanner = new Scanner(System.in); 9 boolean loop = true; 10 11 //輸出一個選單 12 while(loop){ 13 System.out.println("s(show):顯示佇列");
14 System.out.println("e(exit):退出程式"); 15 System.out.println("a(add):新增資料到佇列"); 16 System.out.println("g(get):從佇列取出資料"); 17 System.out.println("h(show):檢視佇列的頭資料"); 18 key = scanner.next().charAt(0);//接收一個字元 19 switch(key){ 20
case 's': 21 queue.showQueue(); 22 break; 23 case 'a': 24 System.out.println("輸出一個數"); 25 int value = scanner.nextInt(); 26 queue.addQueue(value); 27 break; 28 case 'g': 29 try{ 30 int res = queue.getQueue(); 31 System.out.printf("取出的資料是%d\n",res); 32 }catch (Exception e){ 33 System.out.println(e.getMessage()); 34 } 35 break; 36 case 'h'://檢視佇列的頭資料 37 try{ 38 int res = queue.headQueue(); 39 System.out.printf("佇列的頭資料是%d\n",res); 40 }catch (Exception e){ 41 System.out.println(e.getMessage()); 42 } 43 break; 44 case 'e'://退出 45 scanner.close(); 46 loop = false; 47 break; 48 default: 49 break; 50 } 51 } 52 System.out.println("程式退出"); 53 54 } 55 56 57 } 58 59 //使用陣列模擬佇列-CircleQueue類 60 class CircleQueue{ 61 private int maxSize;//表示陣列的最大容量 62 private int front;//指向佇列的第一個元素,arr[front]就是佇列的第一個元素 63 private int rear; //rear指向佇列的最後一個元素的後一個位置,空出一個空間做約定 64 private int[] arr; //該資料用於存放資料,模擬佇列 65 66 //建立佇列的構造器 67 public CircleQueue(int arrMaxSize){ 68 maxSize = arrMaxSize; 69 arr = new int[maxSize]; 70 front = 0; // 71 rear = 0; // 72 } 73 //判斷佇列是否滿 74 public boolean isFull(){ 75 return (rear + 1) % maxSize == front;//front>rear時 中間有一個空間,rear為0 front為1, 76 // 說明1到陣列最大位置都有資料,資料最大的位置就是rear的前一位置 77 } 78 79 //判斷佇列是否為空 80 public boolean isEmpty(){ 81 return rear == front; //front和rear位置一樣代表資料已被取完 因rear指標是指向空的 82 } 83 //新增資料到佇列 84 public void addQueue(int n){ 85 //判斷佇列是否滿 86 if (isFull()){ 87 System.out.println("佇列滿,不能加入資料"); 88 return; 89 } 90 91 arr[rear]=n; 92 //將rear後移 93 rear = (rear+1) % maxSize; 94 95 96 } 97 98 //獲取佇列的資料,出佇列 99 public int getQueue(){ 100 //判斷佇列是否空 101 if (isEmpty()){ 102 //通過丟擲異常處理 103 throw new RuntimeException("佇列空,不能取資料"); 104 105 } 106 //分析出front指向佇列的第一個元素 107 //1.先把front對應的值儲存到一個臨時變數 108 //2.將front後移,考慮取模 109 //3.將臨時儲存的變數返回 110 int value = arr[front]; 111 front = (front +1)% maxSize; 112 return value; 113 114 } 115 116 //顯示佇列的所有資料 117 public void showQueue(){ 118 //遍歷 119 if (isEmpty()){ 120 System.out.println("佇列空的,沒有資料"); 121 return; 122 } 123 //思路:從front開始遍歷,遍歷多少個元素 124 for (int i = front; i <front + size() ; i++) {//front作為起始點 125 System.out.printf("arr[%d]=%d\n",i % maxSize,arr[i % maxSize]); 126 } 127 } 128 //求出當前佇列有效資料的個數 129 public int size(){ 130 // 131 return (rear + maxSize - front) % maxSize; 132 } 133 134 //顯示佇列的頭資料,注意不是取出資料 135 public int headQueue(){ 136 //判斷 137 if (isEmpty()){ 138 139 throw new RuntimeException("佇列空的,沒有資料"); 140 } 141 return arr[front]; 142 } 143 }