クラスを使ったスタック

構造体と同じことがクラスでも実現できることが確かめられた.構造体と同じく,データのセットを持つクラスは,以下のようなものである.

C言語の構造体

struct stack
{
   int volume;
   int data[5];
};

Javaのクラス

class Stack
{
    int volume;
    int data[] = new int[5];
}

ここで,さらに,クラスを使うことで可能になる構成を考えてみる.クラスは,データ以外に,データを処理するサブルーチンを含めることができる.データとサブルーチンをまとめてクラスを構成することができる.クラスを構成するサブルーチンのことを,「メソッド」と呼ぶ.データのメンバーを「フィールド」と呼ぶ.

スタックでは,スタックのデータを持つ配列と,スタックのデータを取り出すサブルーチンと格納するサブルーチンがあるので,それらをまとめて,スタッククラスを作る. メインルーチンにあった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
  • 引数:なし
  • 戻り値:なし
メインメソッド

キューの動作が正常であることを十分確認できるように,クラスに設けたメソッドを全て呼び出して,動作を確かめられる内容にする.

クラスを使ったスタック