C++ std::stack完全ガイド:実践例付きでLIFOコンテナをマスター
std::stackとは
std::stackはLIFO(Last In, First Out / 後入れ先出し)原理を実装するコンテナアダプタです。要素の挿入と削除を片端(トップ)のみで許可します。デフォルトではstd::dequeを内部コンテナとして使用しますが、任意のシーケンスコンテナ(std::vectorやstd::listなど)を指定できます。
コンテナアダプタはイテレータを公開しないため、スタックを直接走査することはできません。代わりにメンバ関数を通じて操作します。
学習目標
std::stackを定義しLIFO動作を理解- スタック宣言の構文を学習
- メンバ型と主要操作を探索
- push、pop、top、empty、size、emplace、swapを実践
- 標準テンプレートライブラリ(STL)でスタックを実装
構文
<stack>ヘッダをインクルードし、以下のテンプレートでスタックを宣言:
template<class T, class Container = std::deque<T>> class stack;
- T – 要素型;ユーザー定義クラスを含む任意の有効なC++型
- Container – 内部コンテナ;デフォルトは
std::deque
メンバ型
value_type– 要素型Tcontainer_type– 内部コンテナの型size_type– コンテナサイズ用の符号なし整数型
主要操作
push()– 要素をトップに追加pop()– トップ要素を削除top()– 削除せずにトップ要素にアクセスempty()– スタックが空かどうかチェックsize()– 要素数を返却emplace()– 要素をトップに直接構築・挿入swap()– 別のスタックと内容を交換
実装の概要
以下はスタック操作の視覚的表現です(トップはポインタで示す)。
push()とpop()
push()メソッドは新しい要素を追加し、サイズを1増やします:
stack.push(value);
逆にpop()はトップ要素を削除し、サイズを減らします:
stack.pop();
例1:基本的なスタック操作
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st;
st.push(10);
st.push(20);
st.push(30);
st.push(40);
st.pop(); // 40を削除
st.pop(); // 30を削除
while (!st.empty()) {
cout << ' ' << st.top();
st.pop();
}
return 0;
}
出力:20 10
empty()、size()、top()
これらのユーティリティ関数はスタックの状態を素早く把握できます。
例2:スタック状態の検査
#include <iostream>
#include <stack>
using namespace std;
void display(stack<int> s) {
while (!s.empty()) {
cout << '\t' << s.top();
s.pop();
}
cout << '\n';
}
int main() {
stack<int> st;
st.push(32);
st.push(21);
st.push(39);
st.push(89);
st.push(25);
cout << "The stack st is: ";
display(st);
cout << "\n st.size() : " << st.size();
cout << "\n st.top() : " << st.top();
st.pop();
cout << "\n st after pop: ";
display(st);
return 0;
}
出力:スタック内容、サイズ、トップ要素、pop後の状態を表示。
emplace()とswap()
• emplace()は要素をその場で構築し、余分なコピーを回避。
• swap()は2つのスタックの内容を効率的に交換。
例3:emplace()とswap()の使用
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st1, st2;
st1.emplace(12);
st1.emplace(19);
st2.emplace(20);
st2.emplace(23);
st1.swap(st2);
cout << "st1 = ";
while (!st1.empty()) {
cout << st1.top() << " ";
st1.pop();
}
cout << endl << "st2 = ";
while (!st2.empty()) {
cout << st2.top() << " ";
st2.pop();
}
}
出力:スワップ前後のスタック内容を示す。
STLでのstd::stack使用
1行でスタックを実装:
std::stack<T> st;
例:
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st;
st.push(12);
st.push(19);
st.push(20);
cout << st.top(); // 20
cout << st.size(); // 3
return 0;
}
まとめ
std::stackはLIFOを実装し、トップ要素のみアクセス可能- コンテナアダプタ;デフォルト内部コンテナは
std::dequeだがカスタマイズ可能 - 主要関数:
push、pop、top、empty、size、emplace、swap - 一時的な要素格納が必要なシナリオで軽量かつ効率的なツール
C言語
- C++演算子を徹底解説:種類、例、サンプルプログラム付き
- C++ do-while文:構文、実践例、ネストしたループ
- C++ switch文をマスター:構文、使い方、実践例
- C++動的配列の確保をマスター:コード例付き実践ガイド
- C++ポインタをマスター:概念、例、実践的応用
- C++演算子オーバーロード:コード例付き実践ガイド
- C++構造体を実例で徹底解説
- C++ std::map完全ガイド:連想配列の実践的活用とコード例
- C++のstd::listをマスターする:構文、関数、実践例
- C++関数を実例で徹底解説:基本から応用まで
- C++ structとclassの違い:構文、特徴、使い分けのベストプラクティス