ここで重要なのは、「先入れ先出し」という主な機能を持つキューを実現するために配列を使用できることです。この状況では、リンク リストを使用することはできません。
この状況において、私たちは何をすべきかを理解する必要があります。以下にすべての主な機能のリストがあります。
- 配列は容量が固定されているため、すべての要素を保存できます。
- エンキュー。満杯でない場合、要素はキューに入ることが許可されます。
- デキュー。空でない場合、要素はキューから離れることができます。
今、私たちは必要なものについて明確な頭を持つことができます。
public class Queue {
private int maxSize;
private int[] queueArray;
private int front;
private int rear;
private int currentSize;
public Queue(int size) {
// init maxSize
maxSize = size;
queueArray = new int[maxSize];
// points the head of queue, it should plus 1 while a element wants to leave.
front = 0;
// rear points the tail of queue, it should plus 1 while a element's comming.
rear = -1;
currentSize = 0;
}
public void enqueue(int item) {
if (isFull()) {
System.out.println("Queue is full. Cannot enqueue item: " + item);
return;
}
rear = (rear + 1) % maxSize;
queueArray[rear] = item;
currentSize++;
}
public int dequeue() {
if (isEmpty()) {
System.out.println("Queue is empty. Cannot dequeue item.");
return -1;
}
int removedItem = queueArray[front];
front = (front + 1) % maxSize;
currentSize--;
return removedItem;
}
public int peek() {
if (isEmpty()) {
System.out.println("Queue is empty. Cannot peek item.");
return -1;
}
return queueArray[front];
}
public boolean isEmpty() {
return currentSize == 0;
}
public boolean isFull() {
return currentSize == maxSize;
}
public int size() {
return currentSize;
}
}
この実装では、配列を使用してキューの要素を格納し、「フロント」変数と「リア」変数は、フロント要素とリア要素のインデックスを観点から追跡します。「currentSize」は、キュー内の要素の数を追跡します。
「enqueue」メソッドはキューの後ろに項目を追加し、「dequeue」メソッドはキューの先頭から項目を削除します。「peek」メソッドはキューの先頭にある項目を削除せずに返します。
"isEmpty" メソッドはキューが空かどうかを確認するために使用され、"isFull" メソッドはキューがいっぱいかどうかを確認します。
さらに、インデックスが配列の外に出ることを避けるために、「%」を使用して前後のインデックスを計算します。さらに、要素を何度も保存または削除する準備をするときに、以前のスペースを再利用するのに役立ちます。
Q&A
Q: フロント要素と実要素のインデックスを追跡するために「フロント」変数と「リア」変数を使用するのはなぜですか。「フロント」変数のみを使用するとどうなるでしょうか?
A: 要素の両側を追跡するために変数 "front" だけを使用すると、後部から複数の要素を削除するか、前部から複数の要素を挿入する必要があるという境界線に達するという問題が発生します。 1 つの変数だけを使用して 2 つの側面を同時に操作することはできません。それがスタックの実装との違いです。
Q: ご存知のとおり、アレイの容量は固定されていますが、システムによってリサイクルされた使用済みスペースを再利用するにはどうすればよいですか?
A: 「%」を使用してインデックスを計算できます。インデックスが maxSize に達したら、最初のインデックスから再度開始できます。