スタックを実装したクラスを拡張する

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

C++のクラス定義・クラスでのスタック実装で書いた、スタックを扱うクラスを少し改良し、子クラスで機能を拡張させてみます。
継承する子クラスで拡張する機能は、以下の2つの機能を拡張します。

スポンサーリンク

1.2つの要素をいっぺんにpushできるようにする。
2.現在のデータの値の合計を求める。

/***********************************
Stack
 整数型のスタックを実装
***********************************/
 
#include <assert.h>
#include <cstdlib>
#include <iostream>
 
const int STACK_SIZE = 100;    // スタックの最大サイズ
 
/***********************************
stackクラス
 整数型のスタックを実装するクラス
 
メンバ関数(メソッド)
 init    :スタック初期化
 push    :スタックに要素プッシュ
 pop     :スタックから要素ポップ
***********************************/
 
class stack {
    private:    // このクラスからのみアクセス可能
        int count;    // スタック内の要素の数
 
    protected:    // 子クラスからアクセス可能にする
        int data[STACK_SIZE];    // 要素
 
    public:
        // スタック初期化
        void init();
        // スタックに要素をプッシュ
        void push(const int item);
        // スタックから要素をポップ
        int pop();
 
        // 要素数countをゲット
        int get_count();
};
 
// stack::init()
inline void stack::init() {
    count = 0;    // スタックの要素数を0に設定
}
 
// stack::push()
inline void stack::push(const int item) {
    assert((count >= 0) &&
        (count <= static_cast<int>(sizeof(data)/sizeof(data[0]))));
    
    data[count] = item;
    ++count;
}
 
// stack::pop()
inline int stack::pop() {
    // スタックの要素数をデクリメント
    --count;
 
    assert((count >= 0) &&
        (count < static_cast<int>(sizeof(data)/sizeof(data[0]))));
    
    // 最後の値を返す
    return (data[count]);
}
 
// stack::get_count()
inline int stack::get_count() {
    return count;
}
 
/***********************************
c_stackクラス
    2つの要素をpush可能にする
 
メンバ関数
    push_two -- 2つ要素を追加
    total -- 要素の値を合計
***********************************/
class c_stack : public stack {
public:
    // スタックに2つの要素をプッシュ
    void push_two(const int item1, const int item2);
    // 要素の値を合計
    int total();
};
 
// stack::push_two()
inline void c_stack::push_two(const int item1, const int item2) {
    // 親クラスstackのメンバ関数stackを使用
    stack::push(item1);
    stack::push(item2);
}
 
// stack::total();
inline int c_stack::total() {
    int i;                // 配列のインデックス
    int total = 0;        // 合計
    int array_count = get_count();    // 配列の要素数
 
    for (i = 0; i < array_count; i++) {
        total += data[i];
    }
 
    return total;
}
 
/**************************************
 * テストルーチン
 **************************************/
int main() {
    // c_stackのオブジェクト生成
    c_stack test_stack;
    test_stack.init();    // stackの初期化
 
    // 要素をスタックにプッシュ
    test_stack.push(5);
    test_stack.push(7);
    test_stack.push_two(12, 300);
    test_stack.push_two(3776, 8);
    test_stack.push(2);
 
    // 要素の数
    int cur_count = test_stack.get_count();
 
    std::cout << "現在の要素の数: ";
    std::cout << cur_count << " 個\n\n";
 
    // 配列要素の値の合計
    std::cout << "配列要素の値の合計: ";
    std::cout << test_stack.total() << "\n\n";
 
    // スタックから要素をポップ
    for (int i = 0; i < cur_count; i++) {
        std::cout << test_stack.pop() << "\n";
    }
 
    return 0;
}
 

「test_stack.push_two(3776, 8);」と、要素を2ついっぺんに追加できます。
また、親クラスのpush, popメンバ関数は、public宣言なので、子クラスのインスタンスからもアクセス可能です。

stackクラスで定義されている要素数を表すcountは、private宣言です。
直接countの値を参照できないので、要素数countを返すpublicなint get_count();を定義しています。
要素の合計の値を返す、c_stackクラスのメンバ関数total()は、スタック配列であるstackクラスのメンバ変数dataにアクセスする必要があります。
ですので、変数dataは、protectedで宣言しています。

実行結果。

現在の要素の数: 7 個
 
配列要素の値の合計: 4110
 
2
8
3776
300
12
7
5

スタック配列の要素の値の合計が、c_stackクラスのメンバ関数total()で求められます。
また、要素は7個となっており、またループ制御でpopすると、上記のように要素の値が取り出されます。
スタックは、LIFO(last-in first-out)ですので、後入れ先出しです。
つまり、後から追加されたデータが、先に取り出されるデータ構造となりますので、最後に追加された「2」が最初に取り出されています。

スポンサーリンク
 
スポンサーリンク