■
import java.util.LinkedList; /** * FIFOを表すためのクラス. */ public class MyQueue implements MyCollection { /** * キューの内容. */ private LinkedList l; // 可変長配列を表すクラス. /** * コンストラクタ */ public MyQueue(){ l = new LinkedList(); // vを初期化. } /** * 引数のオブジェクトをキューに追加する(enqueue). * @param obj 追加するオブジェクト */ public void put(Object obj){ l.addFirst(obj); } /** * キューからオブジェクトを取りだす(dequeue). * @return 取りだされたオブジェクト. キューが空のときはnull. */ public Object get() { if (l.isEmpty()){ // lは空? return null; } Object last = l.removeLast(); // lの末尾の要素を得てそれを削除. return last; } /** * キューを空にする. */ public void clear(){ l.clear(); } /** * キューが空かどうかを判定する. * @return キューが空のときはtrue. それ以外はfalse. */ public boolean isEmpty(){ return l.isEmpty(); } }
プログラムの簡単な説明
//////////////////////////// 課題1
javadoc を実行し生成した、一連のHTMLファイルを読み、
各クラスとインターフェースの関係を調べた。
階層ツリーを見ると、MyStack 及び MyQueue は
インターフェース MyCollection を実装していることが分かる。
また、TestMyStack および TestMyQueue は
TestMyCollection を継承していることがわかる。
MyStack、MyQueue を取り扱うためのメソッドは、
get、put、clear、isEmpty が用意されていることがわかる。
これは、それぞれのクラスの説明を読んでも分かることだが、
インタフェース MyCollection に、この4つの抽象メソッドがあるので、
MyStack、MyQueue はこの4つのメソッドを実装しなければならない。
//////////////////////////// 課題2
MyStack.java 内で使われているVector クラスのメソッドの役割を調べた。
add(Object o)
Vector の末尾に指定の要素を追加する。
isEmpty()
Vector が一つの要素も持っていなかったら true を返す。
そうでなかったら false を返す。
lastElement()
Vector の最後の要素を返す。
removeElementAt(int index)
index番目の要素を削除する。
clear()
全ての要素を削除する。
//////////////////////////// 課題3
フィールドv を、他のクラスから参照・変更できないようにするには、
次のように、フィールドv に private モディファイヤを指定すればよい。
private Vector v; // 可変長配列を表すクラス.
//////////////////////////// 課題4
MyQueue.java の基本的な構造は、MyStack.java と同じである。
そのため、異なっている点を挙げていく。
まず、MyStack では可変長配列に Vector 型を用いているが、
MyQueue では LinkedList 型を用いることにした。
キューの実現には、カーソルを用意する方法もあるが、
私のプログラムでは単純に配列の先頭に要素を挿入する方法を採っているので、
その場合、Vector 型よりも LinkedList 型の方が効率的だからである。
コンストラクタで、配列の初期化をする点はまったく同じである。
異なるのは、Vector か LinkedList か、という点である。
put メソッドでは、LinkedList に用意されている addFirst メソッドを用いて、
配列の先頭に要素を挿入している。
get メソッドは、MyStack では配列の最後の要素を取得して、
配列の最後の要素を削除するという方法を採っているが、
MyQueue では配列に LinkedList を用いているので、
この二つのプロセスは一つの removeLast というメソッドで実現できる。
キューを空にする、また、空かどうかの判定は、
MyStackと何ら変わるところはない。
演習の感想等
課題1と2に関して、
このレポートに何を書けばよいのかよく分かりませんでした。