クラスを使ったスタック
構造体と同じことがクラスでも実現できることが確かめられた.構造体と同じく,データのセットを持つクラスは,以下のようなものである.
ここで,さらに,クラスを使うことで可能になる構成を考えてみる.クラスは,データ以外に,データを処理するサブルーチンを含めることができる.データとサブルーチンをまとめてクラスを構成することができる.クラスを構成するサブルーチンのことを,「メソッド」と呼ぶ.データのメンバーを「フィールド」と呼ぶ.
スタックでは,スタックのデータを持つ配列と,スタックのデータを取り出すサブルーチンと格納するサブルーチンがあるので,それらをまとめて,スタッククラスを作る. メインルーチンにあったpopとpushをクラスに移動させて,データとまとめる.
さらに,メソッドは,属するクラスのフィールドを直接扱うことができるので,メソッドの引数にインスタンスを取る必要がない.それに合致するように,変数のアクセス方法を整理する.
class Stack { //データフィールド int volume; int data[] = new int[5];
//データ追加メソッド boolean push(int number) { if(volume < data.length) { data[volume] = number; volume++; return true; } else { System.out.println("stack overflow"); return false; } } //データ取得メソッド int pop() { int value; if(volume > 0) { value = data[volume -1]; data[volume -1] = 0; volume--; } else { value = -1; } return value; } //状態表示メソッド void printStack() { System.out.print("|"); for(int i=0; i < data.length; i++) { System.out.print(data[i]); System.out.print("|"); } System.out.println(""); } }
スタックのデータを出し入れして,実際にスタックを活用するために,このStackクラスをインスタンス化して,インスタンスにデータを挿入したり,取り出したりする.
class Main { public static void main(String[] args) { //インスタンス化する Stack tower = new Stack(); //データを追加する tower.push(10);tower.printStack(); tower.push(20);tower.printStack(); tower.push(30);tower.printStack(); tower.push(40);tower.printStack(); tower.push(50);tower.printStack(); tower.push(60);tower.printStack(); //データを取り出す System.out.println(tower.pop());tower.printStack(); System.out.println(tower.pop());tower.printStack(); System.out.println(tower.pop());tower.printStack(); System.out.println(tower.pop());tower.printStack(); System.out.println(tower.pop());tower.printStack(); System.out.println(tower.pop());tower.printStack(); } }
実行例
メインクラスのmainメソッドを実行した結果は以下となる.|10|0|0|0|0| |10|20|0|0|0| |10|20|30|0|0| |10|20|30|40|0| |10|20|30|40|50| stack overflow |10|20|30|40|50| 50 |10|20|30|40|0| 40 |10|20|30|0|0| 30 |10|20|0|0|0| 20 |10|0|0|0|0| 10 |0|0|0|0|0| -1 |0|0|0|0|0|
演習
保存するデータの配列と格納データ個数,さらに,そのデータを操作するメソッドにて構成する,「構造体のようにクラスを使ったスタック」のプログラムのように, キューを実現する「キュークラス」を作成せよ.
作成したクラスを操作して,キューとして動作することを確認せよ.
クラス
フィールド
以下の設定をフィールドとするクラスを定義する.- キューの容量:5個に固定
- キューに保存するデータ型:整数
- 保存データ個数:その時々の保存データ個数を覚えておく変数を用意
メソッド
キュー追加メソッド- 関数名:enqueue
- 引数:追加する整数値
- 戻り値:追加成功(true),追加失敗(false)
- 関数名:dequeue
- 引数:なし
- 戻り値:取り出した値.取り出すデータがないときは(-1)
- 関数名:printQueue
- 引数:なし
- 戻り値:なし
キューの動作が正常であることを十分確認できるように,クラスに設けたメソッドを全て呼び出して,動作を確かめられる内容にする.