積み重ねる C++ STL の例
std::スタックとは何ですか?
スタックは、LIFO (Last In First Out) 技術に基づいて動作するデータ構造です。std::stack では、要素を片側からのみ追加および削除できます。
std::stack クラスはコンテナー アダプターです。 コンテナ オブジェクトは、同様のデータ型のデータを保持します。 さまざまなシーケンス コンテナからスタックを作成できます。 コンテナーが指定されていない場合は、デフォルトで両端キューのコンテナーが使用されます。 コンテナ アダプタはイテレータをサポートしていないため、データの操作には使用できません。
スタック構文
スタックを作成するには、 コード内のヘッダー ファイル。 次に、この構文を使用して std::stack を定義します。
template <class Type, class Container = deque<Type> > class stack;
- 種類 – std::stackに含まれる要素の型です。有効な値であれば何でも構いません。 C++ 型またはユーザー定義型です。
- コンテナ – は、基礎となるコンテナ オブジェクトのタイプです。
会員種別
スタック メンバーのタイプは次のとおりです。
- value_type - 最初のテンプレート パラメータ T。要素のタイプを示します。
- container_type - XNUMX 番目のテンプレート パラメーター、コンテナー。 これは、基礎となるコンテナのタイプを示します。
- size_type - 符号なし整数型。
Operaスタック内のオプション
A C++ スタックは次の基本操作をサポートします。
- Push – 項目をスタックに追加/プッシュします。
- Pop – スタックから項目を削除/ポップします。
- Peak – スタックの先頭の項目を削除せずに返します。
- isFull – スタックがいっぱいかどうかを確認します。
- isEmpty – スタックが空かどうかを確認します。
スタックの実装
ステップ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(); } }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- その関数を使用するには、コードに iostream ヘッダー ファイルを含めます。
- その関数を使用するには、コードにスタック ヘッダー ファイルを含めます。
- std 名前空間をコードに含めると、そのクラスを呼び出さずに使用できます。
- main() 関数を呼び出します。 プログラム ロジックはこの関数内に追加する必要があります。
- 整数値を格納するスタック st を作成します。
- Push() 関数を使用して、値 10 をスタックに挿入します。
- Push() 関数を使用して、値 20 をスタックに挿入します。
- Push() 関数を使用して、値 30 をスタックに挿入します。
- Push() 関数を使用して、値 40 をスタックに挿入します。
- Pop() 関数を使用して、スタックから最上位の要素、つまり 40 を削除します。最上位の要素は 30 になります。
- Pop() 関数を使用して、スタックから最上位の要素、つまり 30 を削除します。最上位の要素は 20 になります。
- while ループと empty() 関数を使用して、スタックが空でないかどうかを確認します。! は NOT 演算子です。
- スタックの現在の内容をコンソールに出力します。
- スタック上で Pop() 関数を呼び出します。
- while ループの本体の終わり。
- main() 関数本体の終わり。
empty()、size()、top()
スタックには、スタックとその値を試すために使用できる組み込み関数があります。 これらには次のものが含まれます。
- 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; }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- iostream ヘッダー ファイルの機能を使用するには、コードに iostream ヘッダー ファイルを含めます。
- その関数を使用するには、コードにスタック ヘッダー ファイルを含めます。
- std 名前空間を呼び出さずにそのクラスを使用するには、プログラムに std 名前空間を含めます。
- スタック mystack の作成に使用できる関数 createStack を作成します。 スタックには整数のセットが保持されます。
- createStack 関数の本体の始まり。
- mystack データ型のインスタンスを作成し、ms という名前を付けます。
- while ループと empty() 関数を使用して、スタックが空かどうかを確認します。
- while ループの本体の開始。
- スタックの最上位に保存されている top() 関数を使用します。 \t 文字は新しいタブを作成します。
- スタックの最上位にある要素を削除するには、pop() 関数を使用します。
- while ループの本体の終わり。
- コンソールに空行を出力します。
- createStack 関数の本体の終わり。
- main() 関数を呼び出します。 プログラム ロジックは main() 関数の本体内に追加する必要があります。
- 関数 main() の本体の開始。
- スタック オブジェクト st を作成します。
- Push() 関数を使用して、要素 32 をスタックに挿入します。
- Push() 関数を使用して、要素 21 をスタックに挿入します。
- Push() 関数を使用して、要素 39 をスタックに挿入します。
- Push() 関数を使用して、要素 89 をスタックに挿入します。
- Push() 関数を使用して、要素 25 をスタックに挿入します。
- コンソールにテキストを出力します。
- 上記の挿入操作をスタックに実行するには、createStack 関数を呼び出します。
- スタックのサイズを他のテキストと一緒にコンソールに表示します。
- コンソールのスタックの一番上にある要素を出力します。
- コンソールにテキストを出力します。
- スタックの先頭にある要素を削除します。 その後、スタックに残っている要素を返します。
- 上記の操作を実行するには、createStack 関数を呼び出します。
- プログラムは正常に完了すると値を返す必要があります。
- 関数 main() の本体の終わり。
emplace() と swap()
その他の組み込みスタック関数は次のとおりです。
- emplace() - 次に、新しい要素をスタックの先頭に挿入します。
- swap() - スタックの内容を別のスタックの内容と交換します。
例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(); } }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- その関数を使用するには、コードに iostream ヘッダー ファイルを含めます。
- その関数を使用するには、コードにスタック ヘッダー ファイルを含めます。
- その関数を使用するには、コードに cstdlib ヘッダー ファイルを含めます。
- std 名前空間をコードに含めると、そのクラスを呼び出さずに使用できます。
- main() 関数を呼び出します。 プログラム ロジックは、この関数の本体内に追加されます。
- 整数値を格納するために、st1 という名前のスタックを宣言します。
- 整数値を格納するために、st2 という名前のスタックを宣言します。
- emplace() 関数を使用して、st12 という名前のスタックに整数 1 を挿入します。
- emplace() 関数を使用して、st19 という名前のスタックに整数 1 を挿入します。
- emplace() 関数を使用して、st20 という名前のスタックに整数 2 を挿入します。
- emplace() 関数を使用して、st23 という名前のスタックに整数 2 を挿入します。
- swap() 関数を使用して、1 つのスタック st2 と st1 の内容を交換します。 スタック st2 の内容をスタック st2 に移動する必要があります。 スタック st1 の内容をスタック stXNUMX に移動する必要があります。
- コンソールにテキストを出力します。
- while ステートメントと empty() 関数を使用して、スタック st1 が空でないかどうかを確認します。
- スタック st1 の内容をコンソールに出力します。 「 」は、スタック要素をコンソールに出力するときにスタック要素の間にスペースを追加します。
- スタック st1 で Pop() 関数を実行して、最上位の要素を削除します。
- while ステートメントの本文の終わり。
- コンソールにテキストを出力します。endlは C++ 終了行のキーワード。マウス カーソルを次の行に移動し、そこから印刷を開始します。
- while ステートメントと empty() 関数を使用して、スタック st2 が空でないかどうかを確認します。
- スタック st2 の内容をコンソールに出力します。 「 」は、スタック要素をコンソールに出力するときにスタック要素の間にスペースを追加します。
- スタック st2 で Pop() 関数を実行して、最上位の要素を削除します。
- while ステートメントの本文の終わり。
- 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(); }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- その関数を使用するには、コードに iostream ヘッダー ファイルを含めます。
- その関数を使用するには、コードにスタック ヘッダー ファイルを含めます。
- その関数を使用するには、コードに cstdlib ヘッダー ファイルを含めます。
- std 名前空間をコードに含めると、そのクラスを呼び出さずに使用できます。
- main() 関数を呼び出します。 プログラム ロジックは、この関数の本体内に追加する必要があります。
- 整数データを格納するスタック st を宣言します。
- 要素 12 をスタックに追加します。
- 要素 19 をスタックに追加します。
- 要素 20 をスタックに追加します。
- コンソールのスタックの一番上にある要素を出力します。
- スタックのサイズをコンソールに出力します。
- 関数 main() の本体の終わり。
まとめ
- スタックは、LIFO (Last In First Out) 技術に基づいて動作するデータ構造です。
- std::stack では、一方の端からのみ項目の追加と削除が可能です。
- std::stack クラスは、同様のデータ型の項目を保持するコンテナー アダプターです。
- スタックはさまざまなシーケンス コンテナから作成できます。
- コンテナーを指定しない場合は、デフォルトで deque コンテナーが使用されます。
- Push() 関数は、スタックに項目を挿入するための関数です。
- Pop() 関数は、ステップから先頭の項目を削除するための関数です。
- empty()関数はスタックが空かどうかを確認する関数です。