1. 程式人生 > 其它 >陣列模擬環形佇列

陣列模擬環形佇列

在陣列模擬佇列的基礎上,通過取模達到環形來實現

分析思路:
1.front變數的含義做一個調整:front指向佇列的第一個元素,即front初始值為0,arr[front]即為第一個元素

2.rear變數的含義做一個調整:rear指向佇列的最後一個元素的後一個位置,因為希望空出一個空間作為約定,rear的初始值為0

3.此時,佇列滿的條件為:(rear+1)%maxsize=front

4.佇列為空的條件為: rear=front

5.佇列中有效資料個數為(rear+maxsize-front)%maxsize

實現程式碼

package com.atxihua;



import java.util.Scanner;

public class CircleArryQueueDemo { public static void main(String[] args) { //進行簡單的測試 System.out.println("測試陣列模擬環形佇列"); //建立一個環形佇列 CircleArrayQueue queue=new CircleArrayQueue(4);//設定為4,實際有效長度為3,做了一個額外的空間約定 //接受使用者輸入,注意''之間有空格 char
key = ' '; //鍵盤輸入 Scanner scanner=new Scanner(System.in); //宣告一個boolean型別的loop,控制迴圈 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=scanner.next().charAt(0); switch (key){ case 's': queue.showQueue(); break; case 'a': System.out.println("輸入一個數"); int value=scanner.nextInt(); queue.addQueue(value); break; case 'g': try { int res = queue.getQueue(); System.out.println("取出的資料是:"+ res); } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } break; case 'h': //檢視佇列頭的資料 try { int res = queue.headQueue(); System.out.println("佇列頭的資料是:"+res); } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } break; case 'e': //退出 scanner.close(); loop = false; break; default: break; } } System.out.println("程式退出~~"); } } class CircleArrayQueue{ //表示陣列的最大容量 private int maxSize; //front變數的含義做一個調整:front就指向佇列的第一個元素 //front的初始值=0 private int front; //rear變數的含義做一個調整:rear指向佇列的最後一個元素的後一個位置 //rear的初始值=0 private int rear; //該陣列用於存放資料,模擬佇列 private int[] arr; //建立佇列的構造器,傳遞最大容量的值 public CircleArrayQueue(int arrMaxSiza){ maxSize=arrMaxSiza; arr=new int[maxSize]; //指向佇列頭部,分析出front是指向佇列頭的前一個位置. front=0; //front和rear宣告為int型,初始值為0可以不寫 rear=0; } //判斷佇列是否已滿 public boolean isFull(){ //當佇列尾部與(rear+1)%maxSize==front相等時,說明佇列已滿 return (rear+1)%maxSize==front; } //判斷佇列是否為空 public boolean isEmpty(){ //當佇列頭與佇列尾相等時,說明佇列中沒有資料 return rear==front; } //新增資料到佇列中 public void addQueue(int n){ //判斷佇列是否已滿 if(isFull()){ System.out.println("佇列已滿,不能加入資料!!!");
          //這裡一定要return退出,不然後面環形佇列展示執行了後續程式碼會顯示佇列為空
          return; }
//直接將資料加入 arr[rear]=n; //將rear後移,環形佇列這裡必須考慮取模 rear=(rear+1)%maxSize; } //獲取佇列的資料,出佇列 public int getQueue(){ //判斷佇列是否為空 if(isEmpty()){ //丟擲自定義異常 throw new RuntimeException("佇列為空,沒有資料可取!!!"); } //這裡需要分析出front是指向佇列的第一個元素 //1.先把front對應的值保留到一個臨時變數 //2.將front後移,環形佇列考慮取模,否則會越界 //3.將臨時儲存的變數返回 int value=arr[front]; front=(front+1)%maxSize; return value; } //顯示佇列所有資料 public void showQueue(){ //判斷佇列是否為空 if(isEmpty()){ //這裡可以寫成System.out.println()提示佇列為空就行 System.out.println("佇列為空,沒有資料可取!!!"); } //遍歷有效長度,從頭指標到元素個數次 for(int i=front;i<front+size();i++){ //System.out.println(arr[i]); System.out.printf("arr[%d]=%d\n", i%maxSize, arr[i%maxSize]); } } //求出當前佇列有效個數 public int size(){ return (rear+maxSize-front)%maxSize; } //顯示佇列頭資料,注意不是去出資料 public int headQueue(){ //判斷佇列是否為空 if(isEmpty()){ //丟擲自定義異常 throw new RuntimeException("佇列為空,沒有資料可取!!!"); } //注意front初始值為0,指向佇列第一個元素 return arr[front]; } }

效果展示:

總結:陣列模擬環形佇列的情況,只是在陣列模擬佇列的情況下通過取模來控制佇列迴圈,約定了一個空間做為約定(也可以不約定,只是改變判空和判滿的條件來實現)。