次はスタック構造について説明します。
スタックは後入先出法の考え方で作られたデータ構造です。
「後入先出法」とは、後から追加したデータが先に取り出されるという意味です。
データを格納する事をpushと言い、データを取り出す(削除する)事をpopと言います。
正直ベクタと基本的な考え方は変わりません。
ベクタはpush_backとpop_backという関数で最後尾にデータを追加、削除する事が出来ました。
スタックも同じような事が出来るのですが、ベクタと異なるのは以下の通りです。
スタックの特徴を書きます。
・配列ベースでは無いデータ構造 (最後尾のデータのみアクセス可能) (途中のデータはアクセス不可) ・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が最後尾のデータになりました。
※スタックを使ったプログラム例として「逆ポーランド記法」というものがありますが、長くなりますので興味のある方は自分で調べてください。