前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

13.3. スタック

SFXStack クラスは、 スタックとして複数の要素を操作するためのデータ構造です。 最後に追加(プッシュ)した要素が最初に取得(ポップ)される要素です。

SFXStack クラスは、SFXArray クラスの基底クラスを継承し、 内部的には 配列として処理されます。 内部の配列の最後の要素がスタックの先頭要素であり、内部の配列のサイズがスタックのサイズです。

デフォルトの設定では、 最初に要素を追加したときに SFXStack::SetThreshold 関数で設定するサイズ(デフォルトでは 4 要素分)の内部バッファが確保されます。 その後、順次要素を追加していったとき、 要素を格納する領域が不足する場合は、 SFXStack::SetCluster 関数で設定するクラスタサイズ単位(デフォルトでは 8 要素分)で内部バッファは拡張されます。 逆に、要素が削除されたときは、クラスタサイズ単位でまとめてメモリ再割り当てが実行され、メモリが解放されます。 因みに、1 要素のサイズは 4 バイトです。

内部バッファの拡張は、クラスタサイズ分だけ大きくした連続したメモリ領域が新たに確保され、 そこに既存の全要素がコピーされます。 頻繁にメモリ再割り当てを行うと、パフォーマンス劣化の一因になります。

予め要素数が分かっている場合は、 SFXStack::SetThreshold / SFXStack::SetCluster 関数を使用して内部バッファの設定を最適化することを推奨します。

[Caution] 注意
SFXStack::SetSize 関数を呼び出すと、 スタックのサイズはこの関数の引数に指定した値に設定されます。 この関数により追加された要素は 0 で初期化されます(既存の要素の値はそのままです)。
[Note] 注意
SFXStack は、 配列として扱うことも可能ですが、 以下のスタック特有の関数だけを利用することを推奨します。

以下は、SInt32 型のデータを要素に持つスタックを定義するコードです。

// SInt32 型のデータを要素に持つスタックの定義
SFXStack<SInt32> stack;

// 現在のスタックの状態: stack = ()

要素をスタックにプッシュするには、 SFXStack::Push 関数を呼び出します。

// 現在のスタックの状態: stack = ()

//  スタックに 3 をプッシュする
stack.Push(3);
// 現在のスタックの状態: stack = (3)

//  スタックに -15 をプッシュする
stack.Push(-15);
// 現在のスタックの状態: stack = (3, -15)

//  スタックに 22 をプッシュする
stack.Push(22);
// 現在のスタックの状態: stack = (3, -15,  22)

スタックの先頭要素を参照するには、 SFXStack::Peek 関数を呼び出します。 この関数を実行しても、スタックの内容に変化はありません。

// 現在のスタックの状態: stack = (3, -15,  22)

// スタックの先頭を参照する
SInt32 r = stack.Peek(); // r = 22

// 現在のスタックの状態: stack = (3, -15,  22)

スタックのサイズ(要素数)を取得するには、 SFXStack::GetSize 関数を呼び出します。

// スタックのサイズ(要素数)を取得する
SInt32 n = stack.GetSize(); // n = 3

要素をスタックにポップするには、 SFXStack::Pop 関数を呼び出します。 プッシュした逆順に要素がポップされます。

例 13.4. 要素のポップ

// 現在のスタックの状態: stack = (3, -15,  22)

// スタックの先頭をポップする
SInt32 i = stack.Pop(); // i =  22
// 現在のスタックの状態: stack = (3, -15)

// スタックの先頭をポップする
SInt32 j = stack.Pop(); // j = -15
// 現在のスタックの状態: stack = (3)

// スタックの先頭をポップする
SInt32 k = stack.Pop(); // k =   3
// 現在のスタックの状態: stack = ()
[Caution] 注意
空のスタックをポップしてもエラーは発生しません。 この場合、SFXStack::Pop 関数は、要素の型に応じて 0 または null を返します。