スタックとは?
スタック(stack)は、要素を積み上げるように“一列に並べて”、最後に入れたものを先に取り出すデータ構造で、初心者には「積み重ねた皿」のイメージがわかりやすいでしょう。この出し入れ方式は「LIFO(Last‑In First‑Out/後入れ先出し)」とも呼ばれます。
基本操作:プッシュとポップ
- プッシュ(push):スタックに要素を追加する操作。
- ポップ(pop):スタックの末尾(最新の要素)を取り出して削除する操作。
この操作により、スタックのサイズが変化します。
言語によっては、要素を取り出さずに確認する「ピーク(peek)」や、特定位置の値を書き換える「ポーク(poke)」といった操作もあります。
スタックのイメージとLIFO方式の例
- 実世界の例としては、お皿を積み重ねて使うような構造がわかりやすいです。まさに「最後に置いた皿が最初に取られる」仕組みです。
- 英文記事でも、「Stack is an abstract data type… Push adds, Pop removes the most recently added element… LIFO principle」と明確に説明されています。
スタックの種類とエラー
- 固定サイズスタック:容量が固定されており、満杯になると スタックオーバーフロー(overflow) が発生。
- 動的サイズスタック:動的に増減でき、エラーを回避しやすく設計されることもあります。
スタックの応用例
コールスタック(Call Stack)
プログラムの関数呼び出し時には、戻るアドレスやローカル変数などの情報を一時的に保存するためにスタックが使われます。関数終了時には情報を“ポップ”して処理を戻します。深すぎる呼び出しはスタックオーバーフローの原因となります。
プロトコルスタック(Software/Protocol Stack)
ネットワーク通信などでは、物理層→Ethernet→IP→TCP→HTTPといったように階層的に積み重なる構成を「プロトコルスタック」と呼びます。
フルスタック(Full Stack)
エンジニアリング分野では、複数の技術や処理工程を一人で担当できる人(Webサイト設計・フロントエンド・サーバ運用など)を「フルスタックエンジニア」と呼びます。
キューとの違い
スタックは「LIFO(後入れ先出し)」なのに対し、キュー(queue)は「FIFO(先入れ先出し)」です。たとえば、プリントジョブはキュー方式、関数呼び出し履歴の管理にはスタック方式など、用途に応じて使い分けられます。
まとめ(ポイント振り返り)
| 用語 | 説明 |
|---|---|
| スタック(Stack) | 後入れ先出し(LIFO)方式の基本的なデータ構造 |
| プッシュ(Push) | 要素を追加する操作 |
| ポップ(Pop) | 最新の要素を取り出して削除する操作 |
| ピーク・ポーク | 要素の確認や書き換え操作 |
| コールスタック | 関数呼び出し時の実行情報を管理する仕組み |
| プロトコルスタック | 通信プロトコルを階層的に積み重ねた構成 |
| フルスタック | 幅広い技術分野をカバーするエンジニア |
| キューとの違い | キュー=FIFO、スタック=LIFO |


