C++ で STL スタックコンテナを使用する
- 
          
            C++ で std::stackを使用してスタックコンテナオブジェクトを宣言する
- 
          
            C++ で top()関数を使用して最近追加された要素にアクセスする
- 
          
            C++ で swap()関数を使用して 2つのスタックの内容を交換する
 
この記事では、C++ で STL スタックコンテナを使用する方法に関する複数の方法を示します。
C++ で std::stack を使用してスタックコンテナオブジェクトを宣言する
    
std::stack はコンテナアダプタと呼ばれ、標準コンテナのラッパーとして機能できますが、限定された特殊な機能を提供します。例として、std::stack クラスは LIFO(last-in、firs-out)データ構造を提供し、その下の std::vector または std::deque コンテナーにマップできます。std::stack は、別の stack オブジェクトまたは deque、vector、list などの互換性のあるシーケンスコンテナで初期化できます。ただし、stack 要素を格納するために使用されるデフォルトのコンテナは deque であることに注意してください。また、初期化子リストまたは要素を直接渡すことをサポートするコンストラクターはありません。stack オブジェクトが宣言されたら、push メソッドを使用する必要があります。
stack オブジェクトは、範囲ベースのループを使用して繰り返すことができないことに注意してください。したがって、特別な while ループを実装して、各要素を cout ストリームに出力します。printStack 関数は stack 引数を取りますが、vector オブジェクトによって初期化された st1 は、これら 2つのオブジェクトのタイプが異なり、コンパイラがエラーをスローするため、渡すことができません。
#include <iostream>
#include <stack>
#include <vector>
using std::cout;
using std::endl;
using std::stack;
using std::vector;
template <typename T>
void printStack(stack<T> s) {
  while (!s.empty()) {
    cout << s.top() << "; ";
    s.pop();
  }
  cout << endl;
}
int main() {
  vector<int> vec1 = {1, 2, 3, 4, 11};
  stack st1{vec1};
  stack<int> st2;
  for (int i = 1; i <= 10; ++i) {
    st2.push(i * 12);
  }
  //    printStack(st1); Error - no matching function
  printStack(st2);
  return EXIT_SUCCESS;
}
C++ で top() 関数を使用して最近追加された要素にアクセスする
top() 関数は、スタックの最上位の要素を返すメンバー関数です。この関数は、返された要素を stack オブジェクトから自動的に削除しないことに注意してください。pop メンバー関数を呼び出して削除する必要があります。
#include <iostream>
#include <stack>
using std::cout;
using std::endl;
using std::stack;
int main() {
  stack<int> st2;
  for (int i = 1; i <= 10; ++i) {
    st2.push(i * 12);
  }
  cout << "top of the stack st2: ";
  cout << st2.top() << endl;
  return EXIT_SUCCESS;
}
出力:
top of the stack st2: 120
C++ で swap() 関数を使用して 2つのスタックの内容を交換する
swap() 関数は、stack コンテナのメンバー関数です。stack オブジェクトへの参照を取り、これらのスタックから要素を交換します。vector オブジェクトを使用して初期化される st1 オブジェクトは、swap 関数を呼び出すことも、その引数にすることもできないことに注意してください。コンテナで初期化された stack を swap 関数で使用できるようにするには、st3 オブジェクトが次のコード例で初期化されるため、std::move 呼び出しを使用して作成する必要があります。後者も問題なく printStack 関数に渡すことができます。最後に、st2/st3 スタックオブジェクトの要素を交換し、結果をコンソールに出力します。
#include <deque>
#include <iostream>
#include <stack>
#include <vector>
using std::cout;
using std::deque;
using std::endl;
using std::stack;
using std::vector;
template <typename T>
void printStack(stack<T> s) {
  while (!s.empty()) {
    cout << s.top() << "; ";
    s.pop();
  }
  cout << endl;
}
int main() {
  deque<int> deq1 = {11, 12, 13, 14};
  vector<int> vec1 = {1, 2, 3, 4, 11};
  stack st1{vec1};
  stack<int> st2;
  for (int i = 1; i <= 10; ++i) {
    st2.push(i * 12);
  }
  //    st2.swap(st1); Error
  stack<int> st3{std::move(deq1)};
  printStack(st2);
  printStack(st3);
  st2.swap(st3);
  printStack(st2);
  printStack(st3);
  return EXIT_SUCCESS;
}
出力:
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
14; 13; 12; 11;
14; 13; 12; 11;
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
