例を使用した C++ STL のスタック
std::stack とは?
スタックは、LIFO (Last In First Out) 手法に基づいて動作するデータ構造です。 std::stack を使用すると、一方の端からのみ要素を追加および削除できます。
std::stack クラスはコンテナー アダプターです。コンテナ オブジェクトは、同様のデータ型のデータを保持します。さまざまなシーケンス コンテナーからスタックを作成できます。コンテナーが指定されていない場合は、デフォルトで deque コンテナーが使用されます。コンテナ アダプタはイテレータをサポートしていないため、データの操作には使用できません。
この C++ チュートリアルでは、次のことを学びます
- std::stack とは?
- スタック構文
- 会員の種類
- スタック内の操作
- スタックの実装
- push() と pop()
- 空()、サイズ()、トップ()
- emplace() と swap()
- STL でのスタック
スタック構文
スタックを作成するには、コードに
template <class Type, class Container = deque<Type> > class stack;
- タイプ – std::stack に含まれる要素のタイプです。任意の有効な C++ 型またはユーザー定義型にすることができます。
- コンテナ – は、基礎となるコンテナ オブジェクトのタイプです。
メンバーの種類
スタック メンバー タイプは次のとおりです。
- value_type - 最初のテンプレート パラメータ T。要素の型を示します。
- container_type - 2 番目のテンプレート パラメータ、Container。基になるコンテナーの種類を示します。
- size_type - 符号なし整数型。
スタック内の操作
C++ スタックは、次の基本的な操作をサポートしています:
- push – アイテムをスタックに追加/プッシュします。
- pop – スタックからアイテムを削除/ポップします。
- peek – スタックの一番上のアイテムを削除せずに返します。
- isFull – スタックがいっぱいかどうかを確認します。
- isEmpty – スタックが空かどうかをチェックします。
スタックの実装
ステップ 1) 最初は空のスタックがあります。空のスタックのトップは -1 に設定されます。
ステップ 2) 次に、要素 5 をスタックにプッシュしました。スタックの一番上は要素 5 を指します。
ステップ 3) 次に、要素 50 をスタックにプッシュしました。スタックの一番上が移動し、要素 50 を指します。
ステップ 4) 次に、ポップ操作を実行して、スタックから一番上の要素を削除しました。要素50がスタックからポップされる。スタックの一番上が要素 5 を指すようになりました。
push() と pop()
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(); } }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>空()、サイズ()、トップ()
スタックには、スタックとその値を操作するために使用できる組み込み関数があります。これらには以下が含まれます:
- 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; }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>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(); } }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>STL のスタック
STL (標準テンプレート ライブラリ) には、一般的な C++ データ構造を提供するテンプレート クラスが付属しています。したがって、STL でスタックを実装することもできます。このライブラリをコードにインクルードし、それを使用してスタックを定義するだけです。
stack<T> st;
上記の構文は、データ型 T の要素へのスタック st を宣言します。
例 3:
#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(); }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>まとめ:
- スタックは、LIFO (後入れ先出し) 技術に基づいて動作するデータ構造です。
- std::stack では、一方の端からのみアイテムを追加および削除できます。
- std::stack クラスはコンテナ アダプタであり、同様のデータ型のアイテムを保持します。
- スタックは、さまざまなシーケンス コンテナーから作成できます。
- コンテナを指定しない場合、デフォルトで deque コンテナが使用されます。
- push() 関数は、アイテムをスタックに挿入するためのものです。
- pop() 関数は、ステップから一番上の項目を削除するためのものです。
- empty() 関数は、スタックが空かどうかをチェックするためのものです。
C言語