「データの挿入が一方の端でのみ行われ、削除がもう一方の端でのみ行われる」 リストを、『待ち行列 (queue)』といいます。
「最初に入れたデータが最初に取り出される」ようなデータ構造を "First In First Out" (FIFO)といいます。 これは「最後に入れたデータが最後に取り出される」とも考えられるので "Last In Last Out" (LILO) と言うこともあります。
配列の大きさを
(インデックス+1) を 「配列の大きさ」で割った余り
とすることで簡単に実現できます。
配列が空の状態では front==rearとなります。 もし、配列が一杯になった状態を rear==front で表すと、 空の場合と区別がつかなくなってしまうので、 プログラムでは「必ず1つ空の要素を残しておく」ことにしています。
MyQueue.java |
RunMyQueue.java |
RunMyQueue.javaの実行例 |
|
「グラフ」 (graph) は、「節点」(node, または「頂点」 vertex) を 「辺」(edge, または「枝」 branch)で結んだものです。
このようなグラフをデータとして表現するために、、次のような 隣接行列 (adjacency matrix) を用います。
ノード | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | false | true | false | false | false | false | false | false |
1 | true | false | true | true | true | false | false | false |
2 | false | true | false | false | false | false | true | false |
3 | false | true | false | false | false | false | false | false |
4 | false | true | false | false | false | true | false | false |
5 | false | false | false | false | true | false | true | true |
6 | false | false | true | false | false | true | false | true |
7 | false | false | false | false | false | true | true | false |
行方向をi, 列方向をjとすると、
「節点 $i$ $\longrightarrow$ 節点 $j$ への辺がある場合に true
、無い場合に false
」
となっています。自分自身( $i ~ \rightarrow ~ i$ )へのリンクはないものとしています。
辺に向きを持ったグラフを「有向グラフ」(directed graph)といいますが、 ここでは辺に向きを持たない「無向グラフ」(undirected graph)を扱います。
BFSearch.java |
BFSearch.javaの実行例 |
|
課題提出〆切は次回の講義の開始時刻です。
提出先 | http://ynitta.com/class/algoA/local/handin/list.php?id=kadai5a |
---|---|
提出ファイル | BFSearch2.java |
コメント欄 | graph01data.txtの内容 を入力した時の出力結果 |
BFSearch.java を変更してBFSearch2.javaを作成して下さい。 グラフの様子がプログラムに書いてあるのではなく、実行時に 標準入力から次の形式で読み込むものとします。
入力形式 |
|
入力例(graph01data.txt) |
|
BFSearch2.java(骨子のみ) |
BFSearch2.javaの実行例 |
|
提出先 | http://ynitta.com/class/algoA/local/handin/list.php?id=kadai5b |
---|---|
提出ファイル | DFSearch.java |
コメント欄 | graph01data.txtの内容 を入力した時の出力結果 |
深さ優先探索をするように変更して下さい。
[ヒント] BFSearch2.java の中で、MyQueueを使っている部分を MyStackを使うように変更すればよいだけです。 (push → enqueue, pop → dequeue)
提出先 | http://nw.tsuda.ac.jp/class/algoA/local/handin/list.php?id=kadai4c |
---|---|
提出ファイル | Fraction.java |
コメント欄 | 実行したときの出力結果 |
ユークリッドの互除法を用いて、2個のintegerの最大公約数を計算する メソッドをFraction.javaの中に、getGCD()というメソッド名で記述しなさい。
コメント欄には実行結果を貼り付けておいて下さい。
[例] 自然数 99541 と 81809の最大公約数は403
99541 % 81809 → 17732 「大きい数A」を「小さい数B」で割った余りCを計算
81809 % 17732 → 10881 Bを新しいAに、Cを新しいBにして、計算を繰り返す
17732 % 10881 → 6851
10881 % 6851 → 4030
6851 % 4030 → 2821
4030 % 2821 → 1209
2821 % 1209 → 403
1209 % 403 → 0 余りが0になったときのBが最大公約数
Fraction.java |
Fraction.javaの実行例 |
|
提出先 | http://ynitta.com/class/algoA/local/handin/list.php?id=kadai4d |
---|---|
提出ファイル | MulOperator.java |
コメント欄 |
RunMain の実行時に
を入力した時の出力結果および
RunMain の実行時に、以下の形式でデータを与える。
ただしa , b ,c は +,-,*,/のどれかである。
|
分数計算を行う「逆ポーランド計算機」を作成してみましょう。
まず先程作成した Fraction.java を次の CalcElementを継承する ようにして下さい。
public class Fraction extends CalcElement {
その後で、次のJavaファイルを作成します。
RunMain.java |
CalcElement.java |
Operator.java |
AddOperator.java |
AddOperator.java を参考にして、次の3種類のファイルを作成しなさい。
RunMain.javaの実行例 |
|