std::stack

std::stack を試してみます。

 

 

 

std::stack
ヘッダ <stack> で定義
template<
    class T,
    class Container = std::deque<T>
> class stack;
 

 

テンプレート引数
T - 要素の型
Container - 要素を格納するために使用するベースとなるコンテナの型。このコンテナは SequenceContainer の要件を満たさなければなりません。さらに、通常のセマンティクスを持つ以下の関数を提供していなければなりません。
  • back()
  • push_back()
  • pop_back()
標準のコンテナ std::vector, std::deque, std::list はこれらの要件を満たします。デフォルトでは、特定の stack クラスの実体化に対してコンテナクラスが指定されていない場合、標準のコンテナ std::deque が使用されます。

 

std::stack はスタックの機能、特に LIFO(後入れ先出し) のデータ構造を提供するコンテナアダプタです。

このクラステンプレートはベースとなるコンテナのラッパーとして振る舞います。stackのベースとなるコンテナの末尾へ要素をプッシュし、末尾からポップします。すなわち末尾がスタックトップとなります。

 

 

1. 始めに

[概要]

ja.cppreference.com に記載されているものをベースに改造したサンプルプログラムから提示します。

stack.top() は、コンテナが空だと segmentation fault を発生して異常終了しました。事前に stack.size() を確認してコンテナが空でないことを確認する必要がありそうです。

 

[環境]

コンパイラ : g++, 9.3.0
OS : Ubuntu (WSL2), 20.04

 

[プログラムソース "stack_01.cpp"]

#include <stack> // stack
#include <iostream>

int main()
{
    std::stack<int> s;
    s.push(2);
    s.push(6);
    s.push(51);

    std::cout << s.size() << " elements on stack.\n";
    std::cout << "Top element: "
              << s.top()        // Leaves elements on stack.
              << "\n";
    std::cout << s.size() << " elements on stack.\n";

    while(s.size() > 0){
        std::cout << s.size() << " elements on stack.\n";
        std::cout << "Top element: " << s.top() << "\n";
        s.pop();
    }
    std::cout << s.size() << " elements on stack.\n";

    return EXIT_SUCCESS;
}

 

[出力]

3 elements on stack.
Top element: 51
3 elements on stack.
3 elements on stack.
Top element: 51
2 elements on stack.
Top element: 6
1 elements on stack.
Top element: 2
0 elements on stack.

 

 

参考

 


 

記載

2021-01-04 - 新規作成