- # C言語/C++入門 > C++プリプロセッサ
スタックの実装・構造体で表現
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
スタックを実装するクラスを作る前に、スタックを構造体で考えてみる。
スタック構造体は、以下のように表せます。
スポンサーリンク
const int STACK_SIZE = 100; // スタックの最大サイズ
// スタック本体
struct stack {
int count; // スタック内の要素の数
int data[STACK_SIZE]; // 要素
};
countは、スタックのサイズ(要素の数)を宣言。
data[STACK_SIZE]で、要素を入れる場所を宣言。
LIFO(Last-in First-out:後入れ先出し)、最後に追加して(push)、最初に取り出す(pop)、というルーチン(関数)を作ります。
/***********************************
Stack
整数型のスタックを実装するルーチン
プロシジャ
stack_init :スタック初期化
stack_push :スタックに要素プッシュ
stack_pop :スタックから要素ポップ
***********************************/
#include <assert.h>
#include <cstdlib>
#include <iostream>
const int STACK_SIZE = 100; // スタックの最大サイズ
// スタック本体
struct stack {
int count; // スタック内の要素の数
int data[STACK_SIZE]; // 要素
};
/***********************************
stack_init
スタックの初期化ルーチン
************************************/
inline void stack_init(struct stack& the_stack) {
the_stack.count = 0; // スタックの要素数を初期値0に設定
}
/***********************************
stack_push
プッシュ演算のルーチン。
スタックの最後に要素を追加して、
要素数をインクリメントする。
引数
the_stack :スタック構造体の参照渡し
item :追加する要素の値
戻り値 :なし
************************************/
inline void stack_push(struct stack& the_stack, const int item) {
assert((the_stack.count >= 0) &&
(the_stack.count <= static_cast<int>(sizeof(the_stack.data)/sizeof(the_stack.data[0]))));
the_stack.data[the_stack.count] = item;
++the_stack.count;
}
/***********************************
stack_pop
ポップ演算のルーチン。
スタックの先頭要素を取り出して、
要素数をデクリメントする。
引数
the_stack :スタック構造体の参照渡し
戻り値 :スタックの最後の値
************************************/
inline int stack_pop(struct stack& the_stack) {
// スタックの要素数をデクリメント
--the_stack.count;
assert((the_stack.count >= 0) &&
(the_stack.count < static_cast<int>(sizeof(the_stack.data)/sizeof(the_stack.data[0]))));
// 最後の値を返す
return (the_stack.data[the_stack.count]);
}
// スタックをテストするためのルーチン
int main() {
// stackを使用可能にする
struct stack a_stack; // stack構造体の宣言
stack_init(a_stack); // stackの初期化
// 要素をスタックにプッシュ
stack_push(a_stack, 5);
stack_push(a_stack, 7);
stack_push(a_stack, 2);
stack_push(a_stack, 1);
stack_push(a_stack, 2);
stack_push(a_stack, 3);
// スタックから要素をポップ
std::cout << stack_pop(a_stack) << "\n";
std::cout << stack_pop(a_stack) << "\n";
std::cout << stack_pop(a_stack) << "\n";
std::cout << stack_pop(a_stack) << "\n";
std::cout << stack_pop(a_stack) << "\n";
std::cout << stack_pop(a_stack) << "\n";
return 0;
}
実行結果。
3 2 1 2 7 5
スタックやキューは、Lightweight Languageでも、配列の操作として馴染みがあります。
PHPやRubyには、配列操作の関数として、push, popなどの関数、メソッドが用意されていますが、これはスタックにより実装されていることが分かりました。
C++言語での、上記のようにスタックの実装を確認できたので、PHPやRubyの内部的な動作を少し理解できますね。
スポンサーリンク
<< 前の記事 : パラメータつきのマクロ
- - 関連記事 -
- パラメータつきのマクロ
- #inlude/ヘッダファイル(インクルードファイル)
- #ifdef #endif #undef #ifndef/条件付きコンパイル
- #define/定数定義・マクロ
- プリプロセッサの働き
スポンサーリンク