スタック
筒の中にきれいに重ねられたポテトチップスのように、最後に入れたものから最初に取り出す「片付けボックス」です。
定義 スタックは、コンピュータがデータを順番に整理する代表的な方法(データ構造)の1つです。細長い箱に本を積み重ねていくように、新しいデータを一番上に重ね、取り出すときも一番上にある最新のデータから取り出す仕組みを指します。
レストランに積まれたお皿をイメージしてみましょう
レストランの厨房に行くと、洗い終わったお皿が高く積み重なっていますよね。新しいお皿を置くときは、当然一番上に重ねます。お皿を使うときも、一番下のお皿を無理に引っ張り出したりせず、一番上にあるお皿から自然に手に取ります。
コンピュータの世界でも、このようにデータを積み重ねて管理する仕組みを「スタック」と呼びます。最後に入れたデータが最初に出てくる仕組みです。プログラミングでは、これを後入れ先出し(LIFO: Last In First Out)と呼びます。
私たちが普段よく使う機能の中にも、スタックが隠れています。ウェブブラウザの「戻る」ボタンや、文書作成アプリの「元に戻す(Ctrl+Z / ⌘+Z)」機能がまさにその代表例です。
コンピュータが「やるべきこと」を覚える仕組み
勉強をしている途中に友達から電話がかかってきて、通話中に宅配便のインターホンが鳴った場面を想像してみてください。このとき皆さんは、一番最後に起きた「宅配便の受け取り」を先に行い、その次に「通話を終わらせて」、最後に「もともとやっていた勉強」へと戻るはずです。
コンピュータもプログラムを実行するとき、関数(特定の処理をまとめたコードの塊)を呼び出しながらまったく同じように動きます。ある作業の途中で別の作業を呼び出すと、もとの作業の中断位置をスタックにきちんと積み上げて記録しておくのです。このように処理の順序を記録する領域をコールスタック(Call Stack)と呼びます。
呼び出した作業が終わると、コンピュータはスタックの最上部から記録を取り出し、直前の作業へと安全に戻ります。スタックのおかげで、複雑に入り組んだ処理も迷うことなく元の順番通りに戻ることができるのです。
少し専門的に言うと:あふれると爆発する箱
スタックでは、データを入れる処理(Push)と取り出す処理(Pop)が、必ず片側の出入り口(一番上)だけで行われます。そのため、最上部にあるデータの位置さえ覚えておけばよく、データの出し入れが非常に高速です。
ただし、スタックという箱の大きさはコンピュータのメモリ内で無限ではありません。もしプログラムのミスで自分自身を際限なく呼び出し続けるエラー(無限再帰)が起きると、スタックに記録がどんどん溜まり、最終的に箱からあふれ出してしまいます。
このトラブルこそがスタックオーバーフロー(Stack Overflow)です。有名なエンジニア向けQ&Aサイトの名前の由来にもなっているほど、プログラミングではよく知られた現象です。コンピュータはメモリを保護するため、プログラムを強制終了させます。
🤔 よくある誤解
スタックは途中にあるデータも自由につまみ出して取り出せる。
スタックは一番上にあるデータにしかアクセスできません。途中や一番下のデータを取り出すには、上に積み重なったものを順番にすべて取り出さなければなりません。
🧺 日常で出会う場面
最後に入れたデータを最初に取り出す「後入れ先出し(LIFO)」方式のデータ保管庫です。