BohYoh.comトップページへ

新・明解Javaで学ぶアルゴリズムとデータ構造

戻る  

演習4-4の解答

 本ページに示したアイディアに基づいて、キューを実現するプログラムを作成せよ。
 なお、キューを実現するクラスは、以下に示すフィールドをもったIntAryQueue 型として、List 4-3(pp.138~145)に示すメソッドに対応するメソッドをすべて作成すること。

public class IntAryQueue {
  private int max;    // キューの容量
  private int num;    // 現在のデータ数
  private int[] que;  // キューの本体
  //...
}


// 演習4-4 // int型キュー(リングバッファを用いない) public class IntAryQueue {    //--- 実行時例外:キューが空 ---//    public class EmptyIntAryQueueException extends RuntimeException {       public EmptyIntAryQueueException() { }    }    //--- 実行時例外:キューが満杯 ---//    public class OverflowIntAryQueueException extends RuntimeException {       public OverflowIntAryQueueException() { }    }    private int max;         // キューの容量    private int num;         // 現在のデータ数    private int [] que;      // キューの本体    //--- コンストラクタ ---//    public IntAryQueue(int capacity) {       num = 0;       max = capacity;       try {          que = new int[max];         // キュー本体用の配列を生成       catch (OutOfMemoryError e) {   // 生成できなかった          max = 0;       }    }    //--- キューにデータをエンキュー ---//    public int enque(int xthrows OverflowIntAryQueueException {       if (num >= max)          throw new OverflowIntAryQueueException();         // キューは満杯       que[num++= x;       return x;    }    //--- キューからデータをデキュー ---//    public int deque() throws EmptyIntAryQueueException {       if (num <= 0)          throw new EmptyIntAryQueueException();         // キューは空       int x = que[0];       for (int i = 0; i < num - 1; i++)          que[i= que[i + 1];       num--;       return x;    }    //--- キューからデータをピーク(先頭データを覗く) ---*/    public int peek() throws EmptyIntAryQueueException {       if (num <= 0)          throw new EmptyIntAryQueueException();         // キューは空       return que[num - 1];    }    //--- キューからxを探してインデックス(見つからなければ-1)を返す ---//    public int indexOf(int x) {       for (int i = 0; i < num; i++)          if (que[i]  == x)         // 探索成功             return i;       return -1;                  // 探索失敗    }    //--- キューを空にする ---//    public void clear() {       num = 0;    }    //--- キューの容量を返す ---//    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() {       if (num <= 0)          System.out.println("キューは空です。");       else {          for (int i = 0; i < num; i++)             System.out.print(que[i" ");          System.out.println();       }    } }


// 演習4-4 // int型キュー(リングバッファを用いない)のテストプログラム import java.util.Scanner; class IntAryQueueTester {    public static void main(String[] args) {       Scanner stdIn = new Scanner(System.in);       IntAryQueue s = new IntAryQueue(100);      // 最大100個プッシュできるキュー       while (true) {          System.out.println("現在のデータ数:" + s.size() " / "                                                + s.capacity());          System.out.print("(1)エンキュー (2)デキュー (3)ピーク " +                           "(4)ダンプ (0)終了:");          int menu = stdIn.nextInt();          if (menu == 0break;          int x = 0;          switch (menu) {           case 1:                      // エンキュー             System.out.print("データ:");             x = stdIn.nextInt();             try {                s.enque(x);              catch (IntAryQueue.OverflowIntAryQueueException e) {                System.out.println("キューが満杯です。");             }             break;           case 2:                      // デキュー             try {                 x = s.deque();                System.out.println("デキューしたデータは" + x + "です。");              catch (IntAryQueue.EmptyIntAryQueueException e) {                System.out.println("キューが空です。");             }             break;           case 3:                      // ピーク             try {                 x = s.peek();                System.out.println("ピークしたデータは" + x + "です。");              catch (IntAryQueue.EmptyIntAryQueueException e) {                System.out.println("キューが空です。");             }             break;           case 4:                      // ダンプ             s.dump();             break;          }       }    } }


戻る