★スタック構造(stack)★


次はスタック構造について説明します。

スタックは後入先出法の考え方で作られたデータ構造です。

「後入先出法」とは、後から追加したデータが先に取り出されるという意味です。

データを格納する事をpushと言い、データを取り出す(削除する)事をpopと言います。

正直ベクタと基本的な考え方は変わりません。

ベクタはpush_backとpop_backという関数で最後尾にデータを追加、削除する事が出来ました。

スタックも同じような事が出来るのですが、ベクタと異なるのは以下の通りです。


stack基礎


スタックの特徴を書きます。

・配列ベースでは無いデータ構造
 (最後尾のデータのみアクセス可能)
 (途中のデータはアクセス不可)

・push関数でデータを最後尾に追加

・pop関数で最後尾のデータを削除

・top関数で最後尾のデータを取得

ベクタはデータを追加した後も以前のデータにアクセス出来ます。

スタックは最後尾のデータしかアクセス出来ませんから、前のデータを扱いたい場合はpopして削除する必要があります。

程よい題材が思いつきませんので、使い方のみ書くことにします。

<sample program cpp018-01>

#include <iostream>
#include <stack>

int main()
{
    std::stack<int> stkData;

    for (int i = 0; i < 5; i++) {
        stkData.push(i + 1);
    }

    std::cout << stkData.top() << std::endl;
    
    return 0;
}

<実行結果>

5
続行するには何かキーを押してください・・・

1から5までの5個のデータをpushしました。

最後のデータしかアクセス出来ませんので、top関数で表示しています。

上にも書きましたが、添え字も使えませんし、イテレータも使えません。

pop関数を使うと、最後のデータが削除されます。

<sample program cpp018-02>

#include <iostream>
#include <stack>

int main()
{
    std::stack<int> stkData;

    for (int i = 0; i < 5; i++) {
        stkData.push(i + 1);
    }

    std::cout << stkData.top() << std::endl;
    
    stkData.pop();

    std::cout << stkData.top() << std::endl;
    
    return 0;
}

<実行結果>

5
4
続行するには何かキーを押してください・・・

pop関数を使った事で5が削除され、4が最後尾のデータになりました。


※スタックを使ったプログラム例として「逆ポーランド記法」というものがありますが、長くなりますので興味のある方は自分で調べてください。


次へ

戻る

目次へ