積み重ねる C++ STL の例

⚡ スマートサマリー

積み重ねる C++ STLは、単一の端から要素を追加および削除するLIFOコンテナアダプタを実装しています。ping 順序付きデータを管理するための、deque、vector、listなどの基となるシーケンスコンテナ。

  • 🔘 LIFO原則: std::stackは後入れ先出し(LIFO)の順序に従うため、最後にプッシュされた要素が常に最初に削除されます。
  • 📦 コンテナアダプタ: スタックは既存のシーケンスコンテナをラップし、コンテナタイプが指定されていない場合はデフォルトでデックになります。
  • ➕ コア業務: push、pop、top関数は、それぞれ項目の挿入、最上位項目の削除、最上位項目の読み取りを行います。
  • 🔍 州の審査: empty関数とsize関数は、スタックに要素が保持されているかどうか、および現在いくつの要素が格納されているかを報告します。
  • 🔁 追加機能: emplace関数とswap関数は、要素をその場で構築し、2つのスタックの内容を交換します。
  • 🤖 AI支援: GitHub CopilotのようなAIコーディングアシスタントは、短いコメントからスタックのプッシュ、ポップ、およびトラバーサルの定型コードを生成します。

積み重ねる C++ STL

std::スタックとは何ですか?

スタックは、LIFO (Last In First Out) 技術に基づいて動作するデータ構造です。std::stack では、要素を片側からのみ追加および削除できます。

std::stack クラスはコンテナアダプタです。コンテナオブジェクトは、同じデータ型のデータを保持します。さまざまなシーケンスコンテナからスタックを作成できます。コンテナが指定されていない場合は、デフォルトで deque コンテナが使用されます。コンテナアダプタはイテレータをサポートしていないため、データの操作には使用できません。

スタック構文

スタックを作成するには、 コード内のヘッダー ファイル。 次に、この構文を使用して std::stack を定義します。

template <class Type, class Container = deque<Type> > class stack;
  • タイプ – std::stackに含まれる要素の型です。有効な値であれば何でも構いません。 C++ 型またはユーザー定義型です。
  • コンテナ – は、基礎となるコンテナ オブジェクトのタイプです。

会員種別

スタック メンバーのタイプは次のとおりです。

  • 値の種類– 最初のテンプレートパラメータT。これは要素の型を表します。
  • コンテナタイプ– 2番目のテンプレートパラメータであるContainer。これは、基となるコンテナの種類を示します。
  • サイズタイプ– 符号なし整数型。

Operaスタック内のオプション

A C++ スタックは次の基本操作をサポートします。

  • プッシュ – スタックにアイテムを追加/プッシュします。
  • ポップ スタックからアイテムを削除/ポップします。
  • ピーク スタックの最上位の項目を削除せずに返します。
  • 満杯です スタックが満杯かどうかを確認します。
  • が空です スタックが空かどうかを確認します。

スタックの実装

以下の手順は、アイテムがプッシュされてからポップされる際に、スタックの最上部がどのように移動するかを示しています。

ステップ 1) 最初は空のスタックがあります。空のスタックの最上位は -1 に設定されます。

ステップ2)次に、要素5をスタックにプッシュしました。スタックの最上位は要素5を指します。

ステップ 3) 次に、要素 50 をスタックにプッシュしました。スタックの最上位が移動し、要素 50 を指すようになります。

ステップ4)次に、スタックから最上位の要素を削除するポップ操作を実行しました。要素50がスタックからポップされました。スタックの最上位は要素5を指すようになりました。

スタックの実装

プッシュ()とポップ()

stack::push() 関数は、スタックの先頭に新しい項目を追加します。挿入後、スタックのサイズは 1 増加します。この関数の構文は次のとおりです。

stack.push(value)

値はスタックに挿入する項目です。

stack::pop() 関数はスタックの最上位要素を削除します。これはスタックの最新の要素です。削除後、スタックのサイズは 1 減少します。関数の構文は次のとおりです。

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();
	st.pop();

	while (!st.empty()) {
		cout << ' ' << st.top();
		st.pop();
	}
}

出力:

プッシュ()とポップ()

コードのスクリーンショットは次のとおりです。

プッシュ()とポップ()

Code 説明:

  1. その関数を使用するには、コードに iostream ヘッダー ファイルを含めます。
  2. その関数を使用するには、コードにスタック ヘッダー ファイルを含めます。
  3. std 名前空間をコードに含めると、そのクラスを呼び出さずに使用できます。
  4. main() 関数を呼び出します。 プログラム ロジックはこの関数内に追加する必要があります。
  5. 整数値を格納するスタック st を作成します。
  6. Push() 関数を使用して、値 10 をスタックに挿入します。
  7. Push() 関数を使用して、値 20 をスタックに挿入します。
  8. Push() 関数を使用して、値 30 をスタックに挿入します。
  9. Push() 関数を使用して、値 40 をスタックに挿入します。
  10. Pop() 関数を使用して、スタックから最上位の要素、つまり 40 を削除します。最上位の要素は 30 になります。
  11. Pop() 関数を使用して、スタックから最上位の要素、つまり 30 を削除します。最上位の要素は 20 になります。
  12. while ループと empty() 関数を使用して、スタックが空でないかどうかを確認します。! は NOT 演算子です。
  13. スタックの現在の内容をコンソールに出力します。
  14. スタック上で Pop() 関数を呼び出します。
  15. while ループの本体の終わり。
  16. main() 関数本体の終わり。

empty()、size()、top()

スタックには、スタックとその値を試すために使用できる組み込み関数があります。 これらには次のものが含まれます。

  • 空の()スタックが空かどうかを確認します。
  • サイズ()– スタックのサイズ、つまりスタック内の要素数を返します。
  • 上()– スタックの最上位要素にアクセスします。

例2:

#include <iostream> 
#include <stack>  
using namespace std;
void createStack(stack <int> mystack)
{
	stack <int> ms = mystack;
	while (!ms.empty())
	{
		cout << '\t' << ms.top();
		ms.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: ";
	createStack(st);
	cout << "\n st.size() : " << st.size();
	cout << "\n st.top() : " << st.top();
	cout << "\n st.pop() : ";
	st.pop();
	createStack(st);
	return 0;
}

出力:

empty()、size()、top()

コードのスクリーンショットは次のとおりです。

empty()、size()、top()

Code 説明:

  1. iostream ヘッダー ファイルの機能を使用するには、コードに iostream ヘッダー ファイルを含めます。
  2. その関数を使用するには、コードにスタック ヘッダー ファイルを含めます。
  3. std 名前空間を呼び出さずにそのクラスを使用するには、プログラムに std 名前空間を含めます。
  4. スタック mystack の作成に使用できる関数 createStack を作成します。 スタックには整数のセットが保持されます。
  5. createStack 関数の本体の始まり。
  6. mystack データ型のインスタンスを作成し、ms という名前を付けます。
  7. while ループと empty() 関数を使用して、スタックが空かどうかを確認します。
  8. while ループの本体の開始。
  9. スタックの最上位に保存されている top() 関数を使用します。 \t 文字は新しいタブを作成します。
  10. スタックの最上位にある要素を削除するには、pop() 関数を使用します。
  11. while ループの本体の終わり。
  12. コンソールに空行を出力します。
  13. createStack 関数の本体の終わり。
  14. main() 関数を呼び出します。 プログラム ロジックは main() 関数の本体内に追加する必要があります。
  15. 関数 main() の本体の開始。
  16. スタック オブジェクト st を作成します。
  17. Push() 関数を使用して、要素 32 をスタックに挿入します。
  18. Push() 関数を使用して、要素 21 をスタックに挿入します。
  19. Push() 関数を使用して、要素 39 をスタックに挿入します。
  20. Push() 関数を使用して、要素 89 をスタックに挿入します。
  21. Push() 関数を使用して、要素 25 をスタックに挿入します。
  22. コンソールにテキストを出力します。
  23. 上記の挿入操作をスタックに実行するには、createStack 関数を呼び出します。
  24. スタックのサイズを他のテキストと一緒にコンソールに表示します。
  25. コンソールのスタックの一番上にある要素を出力します。
  26. コンソールにテキストを出力します。
  27. スタックの先頭にある要素を削除します。 その後、スタックに残っている要素を返します。
  28. 上記の操作を実行するには、createStack 関数を呼び出します。
  29. プログラムは正常に完了すると値を返す必要があります。
  30. 関数 main() の本体の終わり。

emplace() と swap()

その他の組み込みスタック関数は次のとおりです。

  • emplace()– スタックを構築し、新しい要素をスタックの最上位に挿入します。
  • スワップ()スタックの内容を別のスタックの内容と交換します。

例3:

#include <iostream>    
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st1;
	stack<int> 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();
	}
}

出力:

emplace() と swap()

コードのスクリーンショットは次のとおりです。

emplace() と swap()

Code 説明:

  1. その関数を使用するには、コードに iostream ヘッダー ファイルを含めます。
  2. その関数を使用するには、コードにスタック ヘッダー ファイルを含めます。
  3. その関数を使用するには、コードに cstdlib ヘッダー ファイルを含めます。
  4. std 名前空間をコードに含めると、そのクラスを呼び出さずに使用できます。
  5. main() 関数を呼び出します。 プログラム ロジックは、この関数の本体内に追加されます。
  6. 整数値を格納するために、st1 という名前のスタックを宣言します。
  7. 整数値を格納するために、st2 という名前のスタックを宣言します。
  8. emplace() 関数を使用して、st12 という名前のスタックに整数 1 を挿入します。
  9. emplace() 関数を使用して、st19 という名前のスタックに整数 1 を挿入します。
  10. emplace() 関数を使用して、st20 という名前のスタックに整数 2 を挿入します。
  11. emplace() 関数を使用して、st23 という名前のスタックに整数 2 を挿入します。
  12. swap() 関数を使用して、1 つのスタック st2 と st1 の内容を交換します。 スタック st2 の内容をスタック st2 に移動する必要があります。 スタック st1 の内容をスタック stXNUMX に移動する必要があります。
  13. コンソールにテキストを出力します。
  14. while ステートメントと empty() 関数を使用して、スタック st1 が空でないかどうかを確認します。
  15. スタック st1 の内容をコンソールに出力します。 「 」は、スタック要素をコンソールに出力するときにスタック要素の間にスペースを追加します。
  16. スタック st1 で Pop() 関数を実行して、最上位の要素を削除します。
  17. while ステートメントの本文の終わり。
  18. コンソールにテキストを出力します。endlは C++ 終了行のキーワード。マウス カーソルを次の行に移動し、そこから印刷を開始します。
  19. while ステートメントと empty() 関数を使用して、スタック st2 が空でないかどうかを確認します。
  20. スタック st2 の内容をコンソールに出力します。 「 」は、スタック要素をコンソールに出力するときにスタック要素の間にスペースを追加します。
  21. スタック st2 で Pop() 関数を実行して、最上位の要素を削除します。
  22. while ステートメントの本文の終わり。
  23. main() 関数の本体の終わり。

STL でのスタック

STL(標準テンプレートライブラリ)には、共通のテンプレートクラスが付属しています。 C++ データ構造。したがって、スタックも STL で実装できます。このライブラリをコードに含めて、スタックを定義するために使用するだけです。

stack<T> st; 

上記の構文は、データ型 T の要素へのスタック st を宣言します。

例4:

#include <iostream>      
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st;
	st.push(12);
	st.push(19);
	st.push(20);
	cout << st.top();   
	cout << st.size();  
}

出力:

STL でのスタック

コードのスクリーンショットは次のとおりです。

STL でのスタック

Code 説明:

  1. その関数を使用するには、コードに iostream ヘッダー ファイルを含めます。
  2. その関数を使用するには、コードにスタック ヘッダー ファイルを含めます。
  3. その関数を使用するには、コードに cstdlib ヘッダー ファイルを含めます。
  4. std 名前空間をコードに含めると、そのクラスを呼び出さずに使用できます。
  5. main() 関数を呼び出します。 プログラム ロジックは、この関数の本体内に追加する必要があります。
  6. 整数データを格納するスタック st を宣言します。
  7. 要素 12 をスタックに追加します。
  8. 要素 19 をスタックに追加します。
  9. 要素 20 をスタックに追加します。
  10. コンソールのスタックの一番上にある要素を出力します。
  11. スタックのサイズをコンソールに出力します。
  12. 関数 main() の本体の終わり。

よくあるご質問

スタックは後入れ先出し(LIFO)方式に従うため、最新の要素から順に削除されます。一方、キューは先入れ先出し(FIFO)方式に従うため、最も古い要素から順に削除されます。それぞれ異なる処理ニーズに適しています。

はい。std::stack は、std::stack のような任意のシーケンス コンテナを 2 番目のテンプレート引数として受け入れます。 デフォルトのdequeはほとんどの場合に適していますが、スタックが予測可能なペースで増加する場合は、vectorを使用することでメモリの局所性を向上させることができます。

スタックは最上位要素のみにアクセスするため、プッシュとポップはどちらも定数時間O(1)で実行されます。基となるデックは既存の要素を移動せずに要素を追加するため、スタックサイズに関係なくパフォーマンスは予測可能です。

std::stack はイテレータを公開していないため、範囲ベースのループはコンパイルされません。すべての値を読み取るには、スタックをコピーしてコピーに対して top() と pop() を繰り返し呼び出すか、走査が必要な場合は deque を使用してください。

pop() 関数は、例外安全性を確保するために、アクセスと削除を分離する設計上、戻り値が void です。読み取りと削除を一度に行うと、コピー中にエラーが発生した場合にデータが失われる可能性があるため、まず top() を呼び出し、次に pop() を呼び出します。

いいえ。std::stackには同期機能が組み込まれていないため、複数のスレッドからの同時プッシュおよびポップ呼び出しはデータ競合を引き起こします。複数のスレッドでスタックを共有する場合は、ミューテックスなどのロック機構を使用して共有アクセスを保護してください。

はい。AIコーディングアシスタントは、コメントや関数名を読み取り、std::stack宣言、プッシュ/ポップループ、および走査ロジックを生成します。 Rev生成された境界チェック(例えば、pop() の前に empty() によるテストなど)を確認することは、安全なプログラムにとって依然として重要です。

Yes. GitHubコパイロット 入力と同時に push、pop、top、empty() の呼び出しを完了し、コンテナの選択肢を提案します。2026 C++ コードインテリジェンスによりシンボル認識機能が追加されたため、複数ファイルにわたるスタックの提案が一貫性を保つようになりました。