今まで紹介した線形リストやベクター
そして木は、物理的なメモリー構造でした。これから紹介する
スタックやキューはメモリー構造ではなく、用途で分けた
データ構造です。つまり、線形リストを利用したスタックやキュー、ベクターを利用した
スタックやキューというものがあります。
とはいうものの、スタックやキューは要素の数が不定で、端の操作が多いので、
一般には線形リストが使われます。
前置きはこのくらいにして、スタックについて説明します。
スタックとは棚のことです。棚と言っても家具屋などで売っている立派な棚ではなくて、
無精な人のアパートを想像してください。雑誌が散乱していますが、床にばらまいておくと
寝るスペースがなくなってしまうので、床に重ねて置いておきます。これがスタックのイメージです。
重ねた雑誌は上からしか取れません。新しい雑誌を重ねる場合は一番上に置くだけです。
つまり取り出せる雑誌は常に最新号です。古い雑誌を取り出したい場合は、一冊ずつ
別の場所に移動して、取り出したい号を取り出し、その上にあった雑誌(別の場所によけた雑誌)
を元通りに重ねます。これがスタックです。このような取り出し方を「LIFO」(
Last In First Out)と言います。
また、スタックに情報を積むことを「pushする」と言い、情報を取り出すことを
「popする」と言います。push, popほど一般的ではありませんが、スタックの
一番上の情報を取り出さずに見るだけのことを「peekする」と言います。
さて、今までの14章のパターンで行くと、「次ページへ」をクリックすると、
例題があるはずですが、今回はありません。というのは、
単方向リストとまったく同じだからです。この単方向リストの例題の
「addhead」と「removehead」を「push」と「pop」に
置き換えて、他の関数を削除した物がスタックです。
ただし、「removeall」をなくすと、メモリーを解放しないでプログラムを
終了してしまうことになるので注意が必要です(ほとんどのOSではこのようなことがないように
忘れても解放してくれます。)。
また、「peek」関数に相当する関数は単方向リストにはありませんが、
ここまで呼んでくれた人ならば、すぐに作ることもできると思います。そうです。
ただ単に、「return *pstart;」という1行の関数を作るだけです。