隊列:有序列表,可以用數組和鏈表實現,先進先出原則,
目前累計服務客戶上千家,積累了豐富的產品開發及服務經驗。以網站設計水平和技術實力,樹立企業形象,為客戶提供成都網站制作、成都做網站、外貿營銷網站建設、網站策劃、網頁設計、網絡營銷、VI設計、網站改版、漏洞修補等服務。創新互聯始終以務實、誠信為根本,不斷創新和提高建站品質,通過對領先技術的掌握、對創意設計的研究、對客戶形象的視覺傳遞、對應用系統的結合,為客戶提供更好的一站式互聯網解決方案,攜手廣大客戶,共同發展進步。尾部加數據(要判斷隊列是否滿),隊首取數據
1.front
含義,指向隊首數據的前一個位置;
front的初始值=-1
2.rear
含義,指向隊尾數據位置;
rear初始值=-1
3.隊列滿是rear == maxSize-1
4.隊列空是front==rear
5.有效個數是rear-front
代碼實現:
1.隊列類public class ArrayQueue {// 使用數組模擬隊列
private int maxSize;//數組的大容量
private int front;//隊列頭
private int rear;//隊列尾
private int[] arr;//存放數據,模擬隊列
public ArrayQueue(int arrMaxSize) {this.maxSize=arrMaxSize;
arr = new int[maxSize];
front = -1;//指向隊列頭的前一個位置
rear = -1;//指向隊列尾的位置
}
// 判斷隊列是否滿
public boolean isFull(){return rear==maxSize-1;
}
// 判斷隊列是否為空
public boolean isEmety(){return rear==front;
}
// 添加數據到隊列中
public void addQueue(int ele){if (!isFull()){arr[++rear]=ele;
return;
}else {System.out.println("隊列已滿");
}
}
// 取出隊列的數據
public int getQueue(){if (isEmety()){throw new RuntimeException("沒有數據,無法取出");
}
return arr[++front];
}
// 獲取隊首數據,不取出
public int headQueue(){if (isEmety()){throw new RuntimeException("沒有數據,無法取出");
}
return arr[front+1];
}
// 顯示隊列所有數據
public void allQueue(){if (isEmety()){System.out.println("沒有數據,無法取出");
return;
}
for (int i = front+1; i< rear+1; i++) {System.out.println(arr[i]);
}
}
}
2.測試隊列public class ArrayQueueDemo {public static void main(String[] args) {ArrayQueue arrayQueue = new ArrayQueue(3);
boolean flag = true;
Scanner sc = new Scanner(System.in);
while (flag){System.out.println("s(show):顯示隊列中的全部數據");
System.out.println("h(head):獲取隊列中隊首數據");
System.out.println("a(add):向隊列添加一個數據");
System.out.println("g(get):取出隊列中的一個元素");
System.out.println("e(exit):退出程序");
System.out.print("請輸入操作:");
char c = sc.next().charAt(0);
switch (c){case 's':
arrayQueue.allQueue();
break;
case 'h':
try {int i = arrayQueue.headQueue();
System.out.println("隊首的數據是:"+i);
} catch (Exception e) {System.out.println(e.getMessage());
}
break;
case 'a':
System.out.print("請輸入要添加的數據:");
int add = sc.nextInt();
arrayQueue.addQueue(add);
break;
case 'g':
try {int get = arrayQueue.getQueue();
System.out.println("取出的數據是:"+get);
} catch (Exception e) {System.out.println(e.getMessage());
}
break;
case 'e':
sc.close();
flag = false;
break;
default:
System.out.println("輸入錯誤");
break;
}
}
System.out.println("程序退出!");
}
}
3.問題分析:(環形隊列可復用)1.目前數組只能使用一次,沒有達到復用的效果,將這個數組用一個算法,改進為環形隊列(取模);
1.解決:使用數組模擬環形隊列1.front
含義改變,由指向隊首數據的前一個位置,變成隊首數據位置
front的初始值=0
2.rear
含義改變,由指向隊尾數據位置,變成隊尾數據的后一個位置
rear初始值=0
空出一個空間作為約定;
3.隊列滿是由rear == maxSize-1
變成(rear+1)%maxSize==front
;
4.隊列空不改變,還是front==rear
5.有效個數是(rear+max-front)%max
public class CircleArrayQueue {private int[] arr;
private int front;
private int rear;
private int maxSize;
public CircleArrayQueue(int maxSize) {this.maxSize = maxSize;
arr = new int[maxSize];
front = 0;
rear = 0;
}
public boolean isFull(){return (rear+1)%maxSize==front;
}
public boolean isEmepty(){return rear==front;
}
//隊列添加元素
public void addQueue(int ele){if (isFull()){System.out.println("隊列滿了,無法添加元素");
return;
}
arr[rear]=ele;
rear=(rear+1)%maxSize;
}
//取出隊首元素
public int getQueue(){if (isEmepty()){throw new RuntimeException("隊列沒有元素,無法取出數據");
}
int a = arr[front];
arr[front]=0;
front = (front+1) % maxSize;
return a;
}
//顯示隊首元素
public int headQueue(){if (isEmepty()){throw new RuntimeException("隊列沒有元素,無法取出數據");
}
return arr[front];
}
//顯示隊列所有數據
public void allQueue(){if (isEmepty()){System.out.println("沒有數據");
return;
}
int count = size();
for (int i = front; i< front+count; i++) {System.out.println(arr[i%maxSize]);
}
}
//有效數據個數
public int size(){return (rear+maxSize-front)%maxSize;
}
}
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
名稱欄目:隊列數組實現-環形隊列-創新互聯
網頁URL:http://vcdvsql.cn/article8/iieop.html
成都網站建設公司_創新互聯,為您提供做網站、企業建站、云服務器、網站制作、網站內鏈、企業網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯