キューデータ構造を実装するJavaプログラム
はじめに
この記事では、Javaでキューデータ構造を実装する方法を詳しく解説します。
キューとは、要素の追加・削除が行われる順序が定められた線形データ構造の一つです。最も基本的な規則は「先入れ先出し(FIFO:First In First Out)」であり、最初に追加された要素が最初に取り出されます。日常的な例でいえば、スーパーマーケットや銀行の待ち行列と同じ仕組みです。
以下に、この記事で扱う処理の具体例を示します。
入力:
入力キュー: [150, 300, 450, 600]
期待される出力:
要素を1つ削除した後のキューの内容: [300, 450, 600]
アルゴリズム
処理の流れは以下のステップのとおりです。
ステップ1 - 開始 ステップ2 - キューを宣言する ステップ3 - 'offer'メソッドを使って要素を追加する ステップ4 - キューの内容を表示する ステップ5 - 'poll'メソッドを使ってキューから要素を削除する ステップ6 - 'poll'メソッド呼び出し後のキューの要素を表示する ステップ7 - 結果を表示する ステップ8 - 終了
例1:標準ライブラリ(LinkedList)を使った実装
まずは、Java標準ライブラリに用意されているQueueインターフェースとLinkedListクラスを利用する方法です。要素の追加にはoffer()メソッド、先頭要素の削除・取得にはpoll()メソッドを使用します。これらのメソッドは、add()やremove()と異なり、失敗時に例外ではなくnullやfalseを返すため、安全にキュー操作を行えます。
import java.util.Queue;
import java.util.LinkedList;
public class Demo {
public static void main(String[] args) {
System.out.println("必要なパッケージをインポートしました");
Queue<Integer> input_queue = new LinkedList<>();
input_queue.offer(150);
input_queue.offer(300);
input_queue.offer(450);
input_queue.offer(600);
System.out.println("キューの定義: " + input_queue);
int removedNumber = input_queue.poll();
System.out.println("要素を削除した後のキューの内容: " +input_queue);
}
}出力
必要なパッケージをインポートしました キューの定義: [150, 300, 450, 600] 要素を削除した後のキューの内容: [300, 450, 600]
poll()メソッドを呼び出すことで、先頭の要素「150」が取り除かれ、残りの要素[300, 450, 600]だけがキューに残っていることが確認できます。
例2:独自クラスによる実装
次に、標準ライブラリに頼らず、配列をベースにした独自のQueueクラスを実装する例を紹介します。この実装では、以下の基本操作をすべて自前で定義しています。
- enQueue():キューの末尾に要素を挿入する
- deQueue():キューの先頭から要素を削除する
- isFull() / isEmpty():キューが満杯か空かを判定する
- display():キュー内の全要素を表示する
public class Queue {
int SIZE = 5;
int items[] = new int[SIZE];
int front, rear;
Queue() {
front = -1;
rear = -1;
}
boolean isFull() {
if (front == 0 && rear == SIZE - 1) {
return true;
}
return false;
}
boolean isEmpty() {
if (front == -1)
return true;
else
return false;
}
void enQueue(int element) {
if (isFull()) {
System.out.println("
キューが満杯です");
}
else {
if (front == -1) {
front = 0;
}
rear++;
items[rear] = element;
System.out.println("
要素 " + element + " を挿入しました");
}
}
int deQueue() {
int element;
if (isEmpty()) {
System.out.println("
キューは空です");
return (-1);
}
else {
element = items[front];
if (front >= rear) {
front = -1;
rear = -1;
}
else {
front++;
}
System.out.println("
要素 " +element + " を削除しました");
return (element);
}
}
void display() {
int i;
if (isEmpty()) {
System.out.println("キューは空です");
}
else {
System.out.println("
キューの要素: ");
for (i = front; i <= rear; i++)
System.out.print(items[i] + " ");
}
}
public static void main(String[] args) {
Queue input_queue = new Queue();
for(int i = 1; i < 6; i ++) {
input_queue.enQueue(i * 100);
}
System.out.println("キューの定義: " + input_queue);
input_queue.enQueue(6);
input_queue.display();
input_queue.deQueue();
input_queue.display();
}
}出力
要素 100 を挿入しました 要素 200 を挿入しました 要素 300 を挿入しました 要素 400 を挿入しました 要素 500 を挿入しました キューの定義: Queue@2a139a55 キューが満杯です キューの要素: 100 200 300 400 500 要素 100 を削除しました キューの要素: 200 300 400 500
この実装では、容量5の配列に100〜500までの5つの要素を挿入した後、さらに要素を追加しようとして「キューが満杯です」というメッセージが表示されます。また、deQueue()によって先頭の要素「100」が削除され、以降の要素が正しく前に詰められていることがわかります。なお、オブジェクトを直接文字列連結すると「Queue@2a139a55」のようなハッシュ値が表示されるため、実際の開発ではdisplay()メソッドのように内容を明示的に出力するのが一般的です。
まとめ
この記事では、Javaにおけるキューデータ構造の実装方法を2つのアプローチで紹介しました。LinkedListを利用した標準ライブラリ方式は簡潔で実用的であり、日常的な開発ではこちらが推奨されます。一方、配列ベースの独自実装は、キューの内部動作(front/rearポインタの管理、満杯・空の判定など)を深く理解するのに役立ちます。用途に応じて両者を使い分けるとよいでしょう。
-
【Java入門】長方形の周囲(外周)を求めるプログラムの作り方
長方形の周囲とは? この記事では、Javaを使って長方形の周囲(外周)を求める方法を解説します。長方形の周囲とは、長方形の4つの辺すべての長さを足し合わせた合計のことで、次の図のように「縦の辺2本」と「横の辺2本」の長さを合計したものに相当します。 長方形は向かい合う辺の長さが等しいという性質を持つため、周囲は次の式で計算できます。 周囲 = 2 ×(縦の長さ + 横の長さ) 入力と出力の例 たとえば、入力が次の値であるとします。 長方形の各辺の長さ:5, 8, 5, 8 このとき、期待される出力は次のとおりです。 Perimeter : 26 アルゴリズム 処理の流れは以下のようになりま
-
Javaでカウンタープログラムを実装する方法をわかりやすく解説
この記事では、JavaのSwingを使ってシンプルなカウンター(数を数える)アプリケーションを実装する方法を解説します。このプログラムでは、JLabelでカウント用のラベルを表示し、JTextFieldで現在のカウント値を保持し、JButtonで「追加(Add)」「削除(Remove)」「リセット(Reset)」の3つのボタンを作成します。 「Add」ボタンをクリックするとJTextField内のカウントが1ずつ増加し、「Remove」ボタンをクリックすると1ずつ減少します。さらに「Reset」ボタンをクリックすると、カウントは0にリセットされます。 実装例 import java.awt.*