package queue; import java.util.Scanner; public class ArrayQueueLoop { public static void main(String[] args) { // TODO Auto-generated method stub //測試代碼 //測試數組循化隊列 CircleQueue testQueue=new CircleQueue(4);//設置的是有效的數據,存在有一個空間作為約定 char key=' ';//接受用戶的輸入 Scanner in=new Scanner(System.in); boolean loop=true; //輸出一個菜單 while(loop) { System.out.println("s(show):顯示隊列"); System.out.println("e(exit):退出程序"); System.out.println("a(add):添加數據到隊列"); System.out.println("g(get):從隊列取出隊列"); System.out.println("h(head):查看隊列頭的數據"); key=in.next().charAt(0); switch (key) { case 's': testQueue.showQueue(); break; case 'e': in.close(); loop=false; break; case 'a': System.out.println("請輸入要入隊的數字:"); int add=in.nextInt(); testQueue.addQueue(add); break; case 'g': try { System.out.printf("出隊的元素為:%d\n",testQueue.getQueue()); } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } break; case 'h': try { System.out.printf("隊首元素為:%d\n",testQueue.headQueue()); } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } break; default: break; } } System.out.println("退出成功!"); } } class CircleQueue { private int maxSize;//數組的最大容量 private int front;//指向隊列的頭 private int rear;//指向隊列的尾部 private int[] arr;//該數組用於存放隊列,模擬隊列 //創建隊列的構造器 public CircleQueue(int arrMaxSize) { maxSize=arrMaxSize; arr=new int[maxSize]; front=0;//指向隊列的頭部,初始值為0 rear=0;//指向隊列的尾部的后一個位置,初始值為0 } //判斷隊列是否滿 public boolean isFull() { return rear==maxSize-1; } //判斷隊列是否為空 public boolean isEmpty() { return rear==front; } //添加數據到隊列 public void addQueue(int n) { //判斷隊列是否滿了 if(isFull()) { System.out.println("隊列滿,不能加入數據!"); } //直接將數據加入就好了 arr[rear]=n; //將rear后移此處必須取模 rear=(rear+1)%maxSize; } //獲取隊列的數組,數據出隊列 public int getQueue() { //判斷隊列是不是空了 if(isEmpty()) { //拋出異常 throw new RuntimeException("隊列空,不能夠取數據!"); } else//不為空 { //這里需要分析出,front是隊列第一個元素 //1.先front的對應的值保存到一個臨時的變量 //2.front后移 //3.將臨時保存的變量返回 int value=arr[front]; front=(front+1)%maxSize; return value; } } //顯示隊列所有的數據 public void showQueue() { //簡單的遍歷 if(isEmpty()) { System.out.println("隊列為空,沒有數據!"); return; } //思路從front開始遍歷,遍歷時候要遍歷多少個元素就可以了 //要求出當前隊列的個數 for(int i=front;i<(front+getQueueElementNumbers());i++) { System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);//注意可能會越界,所以要取模 } } //返回當前隊列有多少元素 public int getQueueElementNumbers() { return (rear+maxSize-front)%maxSize; } //顯示隊列的頭數據,注意不是取出數據 public int headQueue() { //判斷隊列已經為空就沒有頭數據 if(isEmpty()) { System.out.println("隊列空的,沒有數據!"); throw new RuntimeException("隊列空的,沒有數據!"); } return arr[front]; } }