■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ public class IntAryQueue <E>{
private int max; // 最大 private int num; // キューに格納されている個数 private int front; // 先頭 private int rear; // 末尾 private E [] que; // キュー
// コンストラクタ public IntAryQueue(int capacity) { max = capacity; num = 0; front = 0; rear = 0; try { que =(E[]) new Object[max]; } catch (OutOfMemoryError e) { max = 0; } }
// オーバーフロー public static class OverflowIntAryQueueException extends RuntimeException { OverflowIntAryQueueException() { } }
// エンプティ public static class EmptyIntAryQueueException extends RuntimeException { EmptyIntAryQueueException() { } }
// エンキュー public void enque(E x) { // キューが満杯のときエラー if (num >= max) { throw new OverflowIntAryQueueException(); } // そうでなければキューに追加する que[rear++] = x; num++; // 配列の最後までいったときカウントを0にする if (rear >= max) { rear = 0; } }
// デキュー public E deque() { // キューが空のときエラー if (num <= 0) { throw new EmptyIntAryQueueException(); } // キューから取得する E x = que[front]; que[front++] = null; num--; // 配列の最後までいったとき if (front >= max) { front = 0; } return x; }
// ピーク public E peek() { // キューが空のときエラー if (num <= 0) { throw new EmptyIntAryQueueException(); } // そうでなければキューからピークする return que[front]; }
// インデックス検索 表示されるデータの何番目に存在するか public int index(E x) { int tmpfront = front; int cnt = 1; for (int i = 0; i <= num; i++) { if (que[tmpfront++] == x) { return cnt; } cnt++; // 配列の最後までいったときfrontを0にする if (tmpfront == max) { tmpfront = 0; } } return -1; }
// キューをからにする public void empty() { for (int i = 0; i < max; i++) { que[i] = null; } }
// キューの容量を返す public int capacity() { return max; }
// データ数を返す public int size() { return num; }
// キューはからであるか public boolean isEmpty() { return num <= 0; }
// キューは満杯であるか public boolean isFull() { return num >= max; }
// キューのデータを先頭→末尾に表示 public void dump() { int tmpfront = front; for (int i = 1; i <= num; i++) { System.out.println(que[tmpfront]); tmpfront++;
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); IntAryQueue<String> s = new IntAryQueue<String>(4); // 最大100個プッシュできるキュー