今天小編給大家分享一下java怎么實現環形隊列的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

創新互聯是一家專注于網站建設、網站制作與策劃設計,大田網站建設哪家好?創新互聯做網站,專注于網站建設十載,網設計領域的專業建站公司;建站業務涵蓋:大田等地區。大田做網站價格咨詢:13518219792
1、普通隊列存在什么問題?
隊列大家都知道,有幾個重要的屬性:
空隊列的rear和front都等于-1,入隊時,front不動,rear++,當 rear == capacity - 1時,隊列已滿;出隊時,rear不動,front++,當front == rear時,隊列為空。看起來很完美,但實際上有問題。假如一個隊列capacity = 3,入隊了三個元素,此時front = -1; rear = 2,然后再將三個元素都出隊,此時front = 2, rear = 2。這時隊列明明是空的,但是卻不能再入隊元素的,因為滿足rear = capacity - 1,也就是相當于這隊列是一次性的,用過之后就不能再用了,即使為空也不能再入隊了,造成空間的浪費,所以環形隊列就出現了。
2、環形隊列實現思路:
環形隊列中的幾個重要屬性:
下面是環形隊列的一些算法:
front == rear(rear + 1) % capacity == front(rear + capacity - front) % capacityrear = (rear + 1) % capacityfront = (front + 1) % capacity;判斷隊列是否已滿是環形隊列中最重要也是最難理解的地方。假如有一個隊列capacity = 3,入隊操作如下:
front = 0,因為
(rear + 1) % capacity = 1 % 3 != front,所以元素可以入隊,元素入隊后
rear = 1;front = 0,因為
(rear + 1) % capacity = 2 % 3 != front,所以元素可以入隊,元素入隊后
rear = 2;front = 0,因為
(rear + 1) % capacity = 3 % 3 == front,所以元素不能入隊,隊列已滿;隊列容量明明是3,只入隊了兩個元素就告訴我隊列滿了?沒錯,這種判斷隊列是否已滿的算法需要犧牲數組的一個空間。
現在進行出隊操作:
front = 1,
rear = 2,
(rear + 1) % capacity = 3 % 3 = 0 != front。可以發現,當一個元素出隊后,又滿足入隊條件了,所以數組空間就可以重復利用了。
3、代碼實操:
public class CircleQueue<E> {
private int capacity;
private int front;
private int rear;
private Object[] arr;
public CircleQueue(int capacity){
this.capacity = capacity;
this.arr = new Object[capacity];
this.front = 0;
this.rear = 0;
}
public boolean isFull(){
return (rear + 1) % capacity == front;
}
public boolean isEmpty(){
return rear == front;
}
public void addQueue(E e){
if (isFull()){
throw new RuntimeException("隊列已滿,入隊失敗");
}
arr[rear] = e;
// rear指針后移
rear = (rear + 1) % capacity;
}
public E getQueue(){
if (isEmpty()){
throw new RuntimeException("隊列為空,出隊失敗");
}
E val = (E) arr[front];
front = (front + 1) % capacity;
return val;
}
public int getSize(){
return (rear + capacity - front) % capacity;
}
// 遍歷
public void showQueue(){
if (isEmpty()){
return;
}
for (int i = front; i < front + getSize(); i++) {
System.out.printf("arr[%d]=%d\n", i%capacity, arr[i%capacity]);
}
}
public static void main(String[] args){
CircleQueue<Integer> queue = new CircleQueue<>(3);
queue.addQueue(1);
queue.addQueue(2);
queue.showQueue();
//queue.addQueue(3);
System.out.println(queue.getSize());
System.out.println(queue.getQueue());;
queue.addQueue(3);
queue.showQueue();
}
}以上就是“java怎么實現環形隊列”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注創新互聯行業資訊頻道。
當前題目:java怎么實現環形隊列
分享路徑:http://www.yijiale78.com/article12/pcssdc.html
成都網站建設公司_創新互聯,為您提供企業網站制作、自適應網站、Google、網站制作、網站維護、網站內鏈
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯