🧩

【Java】キュー

2024/11/24に公開

この記事は、「新・明解Javaで学ぶアルゴリズムとデータ構造」を読んで学んだことを、個人的な備忘録目的でまとめています。

ただし、本を参考にして自分なりに構成やコードを変更しているためご注意ください。
アルゴリズムの詳細や解説は是非参考書をお手に取って読まれてください。

【リンク紹介】
Javaで学ぶアルゴリズムとデータ構造
これまで書いたシリーズ記事一覧

キュー

package chap04;

public class IntQueue {
	
	private int[] que;         // キュー用の配列
	private int   capacity;    // キューの容量
	private int   front;       // 先頭要素カーソル
	private int   rear;        // 末尾要素カーソル
	private int   num;         // 現在のデータ数
	
	//--- 実行時例外:キューが空 ---//
	public class EmptyIntQueueException extends RuntimeException {
		
		// 例外発生時の処理は利用例にて記述する
		public EmptyIntQueueException() {}
	}
	
	//--- 実行字例外:キューが満杯 ---//
	public class OverflowIntQueueException extends RuntimeException {
		
		// 例外発生時の処理は利用例にて記述する
		public OverflowIntQueueException() {}
	}
	
	//--- コンストラクタ ---//
	public IntQueue(int maxlen) {
		
		// 初期化
		capacity = maxlen;
		front    = 0;
		rear     = 0;
		num      = 0;
		
		// 例外:キュー本体用の配列を生成失敗
		try {
			que = new int[capacity];
		} catch (OutOfMemoryError e) {
			capacity = 0;
		}
	}
	
	//--- キューにデータを追加(エンキュー)---//
	public int enque(int x) throws OverflowIntQueueException {
		
		// キューが満杯のとき
		if (num >= capacity)
			throw new OverflowIntQueueException();
		
		que[rear++] = x;
		num++;
		
		// rearが配列の末尾に来たら
		if (rear == capacity)
			rear = 0;    // 先頭のインデックスに戻す
		
		return x;
	}
	
	//--- キューからデータを取り出す(デキュー) ---//
	public int deque() throws EmptyIntQueueException {
		
		// キューが空のとき
		if (num <= 0)
			throw new EmptyIntQueueException();
		
		int x = que[front++];
		num--;
		
		if (front == capacity)
			front = 0;
		
		return x;
	}
	
	//--- ピーク(先頭データを覗き見) ---//
	public int peek() throws EmptyIntQueueException {
		
		if (num <= 0)
			throw new EmptyIntQueueException();
		
		return que[front];
	}
	
	//--- キューを空にする ---//
	public void clear() {
		
		// 初期化
		front = 0;
		rear  = 0;
		num   = 0;
	}
	
	//--- インデックスを返す ---//
	public int indexOf(int x) {
		
		for (int i = 0; i < num; i++) {
			int idx = (i + front) % capacity;
			
			if (que[idx] == x)    // 探索成功
				return idx;
		}
		
		return -1;                // 探索失敗
	}
	
	//--- キューの容量を返す ---//
	public int getCapacity() {
		return capacity;
	}
	
	//--- キューに蓄えられているデータを数を返す ---//
	public int size() {
		return num;
	}
	
	//--- キューは空であるか ---//
	public boolean isEmpty() {
		return num <= 0;
	}
	
	//--- キューは満杯であるか ---//
	public boolean isFull() {
		return num >= capacity;
	}
	
	//--- キュー内の全データを先頭→末尾の順に表示 ---//
	public void dump() {
		
		if (num <= 0) 
			System.out.println("キューは空です。");
		else {
			for (int i = 0; i < num; i++)
				System.out.print(que[(i + front) % capacity] + " ");
			System.out.println();
		}
	}

}

学習内容まとめ

eclipse操作時に役立つショートカットまとめ
https://qiita.com/toshi0383/items/1d2a990392998789062c

\bf{\textcolor{red}{記事が役に立った方は「いいね」を押していただけると、すごく喜びます \ 笑}}
ご協力のほどよろしくお願いします。

Discussion