スタック 【stack】

概要

スタック(stack)とは、最も基本的なデータ構造の一つで、要素が入ってきた順に一列に並べ、後に入れた要素から順に取り出すという規則で出し入れを行うもの。本や書類、箱などを積み上げて置くことになぞらえてこのように呼ばれる。

解説 スタックは要素が入ってきた順に並べ、先頭が最も古く、末尾が最も新しい要素となる。取り出すときは末尾にある最も新しいものから順に取り出す。このように後に入れたものほど先に取り出される管理方式を「LIFO」(Last-In First-Out/後入れ先出し)あるいは「FILO」(First-In Last-Out/先入れ後出し)という。

ほとんどのマイクロプロセッサにはメモリ領域に設けたスタックを操作するための機械語の命令やレジスタなどを内蔵しており、機械語のプログラムの実行制御などで非常によく用いられるデータ構造として知られる。特に、サブルーチンや関数を呼び出す際に処理中のデータや戻りアドレスなどを一時的に退避するコールスタック実行スタック)のことを単にスタックと呼ぶ場合もある。

一方、先に追加した要素ほど先に取り出される(先頭から順に取り出す)規則で要素の出し入れを管理するデータ構造は「キュー」(queue)あるいは「待ち行列」と呼ばれる。

プッシュ/ポップ (push/pop)

スタックに要素を追加する操作を「プッシュ」(push)、取り出す操作を「ポップ」(pop)という。プッシュされた要素はスタックの末尾に追加され、スタックの要素数は1増加する。

ポップを指示するとスタックの末尾の要素が取り出され、その要素はスタックから取り除かれる。末尾から2番目にあった要素(2番目に新しかった要素)が新しい末尾となり、スタックの要素数は1減少する。

プログラミング言語などによっては、この2つの操作に加え、末尾あるいは指定位置の要素を取り出さずに値を読み込む「ピーク」(peek)、末尾あるいは指定位置の値を書き換える「ポーク」(poke)といった操作を提供している場合もある。

プロトコルスタック/ソフトウェアスタック

ネットワークプロトコル(通信規約)やソフトウェアは物理的な装置や回線に近い部分から利用者に近いものまで、役割に応じて階層構造に分かれていることが多い。

このとき、互いに相互運用性のあるプロトコルやソフトウェアを積み重ね、全体として一つのシステムや機能を実現したものをプロトコルスタック、ソフトウェアスタックなどということがある。

例えばプロトコルであれば、物理層からアプリケーション層まで、UTPケーブル - Ethernet - IP(Internet Protocol) - TCP(Transmission Control Protocol) - HTTP(Hypertext Transfer Protocol)といったように積み上げた各階層の機能が互いに連携しあって通信が可能となる。

専門知識や技能のスタック

ある事業や業務に必要な専門的な知識や技能の総体を、プロトコルやソフトウェアになぞらえて階層状に整理したものをスタックと呼ぶことがある。

階層の積み上げ方は分野によって異なり、ソフトウェアのようにハードウェア寄りから利用者寄りへ重ねていく場合と、企画-設計-実装-…といったように工程の前後関係に基づいて整理する考え方がある。特に、ある事業分野に必要なすべてのスキルを一人で備え、すべて遂行することができる技術者のことを「フルスタックエンジニア」(英語では “full stack developer”)という。

例えば、Webサービスを開発・提供する場合に、通常はそれぞれの専門的なスタッフや部門で分業される、企画、設計、ページやユーザーインターフェースのデザイン、画像制作、HTML/CSSコーディング、サーバ側(バックエンド)プログラミング、クライアント側(フロントエンド)プログラミング、テスト、機材や回線の調達・導入、ネットワーク設定、サーバ管理、システム運用、プロモーション、利用者サポートなどを一人でできる人材のことをフルスタックであるという。

(2018.10.30更新)

他の用語辞典による「スタック」の解説 (外部サイト)

資格試験などの「スタック」の出題履歴

▼ ITパスポート試験
令1秋 問62】 下から上へ品物を積み上げて、上にある品物から順に取り出す装置がある。この装置に対する操作は、次の二つに限られる。PUSH x : 品物xを1個積み上げる。
平30秋 問76】 複数のデータが格納されているスタックからのデータの取出し方として、適切なものはどれか。
平28秋 問92】 後に入れたデータが先に取り出されるデータ構造(以下、スタックという)がある。これを用いて、図に示すような、右側から入力されたデータの順番を変化させて、左側に出力する装置を考える。
平22春 問85】 下から上ヘデータを積み上げ、上にあるデータから順に取り出すデータ構造(以下、スタックという)がある。これを用いて、図に示すような、右側から入力されたデータの順番を変化させて、左側に出力する装置を考える。

▼ 基本情報技術者試験
令6修12 問5】 十分な大きさの配列Aと初期値が0の変数pに対して,関数 f(x) と g() が次のとおり定義されている。配列Aと変数pは,関数 f(x) と g() だけでアクセスが可能である。
令6修7 問5】 A,B,C,Dの順に到着するデータに対して,一つのスタックだけを用いて出力可能なデータ列はどれか。
令6修1 問5】 スタック操作の特徴を表す用語はどれか。
令5修7 問5】 空の状態のキューとスタックの二つのデータ構造がある。次の手続を順に実行した場合,変数xに代入されるデータはどれか。ここで,手続で引用している関数は,次のとおりとする。
令4修7 問7】 空の状態のキューとスタックの二つのデータ構造がある。次の手続を順に実行した場合,変数xに代入されるデータはどれか。ここで,手続で引用している関数は,次のとおりとする。
令3修12 問7】 十分な大きさの配列Aと初期値が0の変数pに対して,関数 f(x) と g() が次のとおり定義されている。配列Aと変数pは,関数 f(x) と g() だけでアクセスが可能である。
令3修7 問8】 三つのスタックA,B,Cのいずれの初期状態も [1,2,3] であるとき,再帰的に定義された関数 f() を呼び出して終了した後のBの状態はどれか。
令3修6 問7】 A,B,C,Dの順に到着するデータに対して,一つのスタックだけを用いて出力可能なデータ列はどれか。
令3修1 問7】 空の状態のキューとスタックの二つのデータ構造がある。次の手続を順に実行した場合,変数xに代入されるデータはどれか。ここで,手続で引用している関数は,次のとおりとする。
令2修7 問8】 加減乗除を組み合わせた計算式の処理において,スタックを利用するのが適している処理はどれか。
令2修1 問8】 PUSH命令でスタックにデータを入れ,POP命令でスタックからデータを取り出す。動作中のプログラムにおいて,ある状態から次の順で10個の命令を実行したとき,スタックの中のデータは図のようになった。
令1修12 問7】 A,B,C,Dの順に到着するデータに対して,一つのスタックだけを用いて出力可能なデータ列はどれか。
令1秋 問8】 A,C,K,S,Tの順に文字が入力される。スタックを利用して,S,T,A,C,Kという順に文字を出力するために,最小限必要となるスタックは何個か。
平31春 問6】 三つのスタックA,B,Cのいずれの初期状態も [1,2,3] であるとき,再帰的に定義された関数 f() を呼び出して終了した後のBの状態はどれか。
平30修12 問8】 プログラムの実行に関する次の記述の下線部 a~d のうち,いずれかに誤りがある。誤りの箇所と正しい字旬の適切な組合せはどれか。
平30修6 問6】 加減乗除を組み合わせた計算式の処理において,スタックを利用するのが適している処理はどれか。
平30春 問5】 次の二つのスタック操作を定義する。 PUSH n:スタックにデータ(整数値n)をプッシュする。 POP:スタックからデータをポップする。
平29修12 問6】 十分な大きさの配列Aと初期値が0の変数pに対して,関数 f(x) と g() が次のとおり定義されている。配列Aと変数pは,関数 f(x) と g() だけでアクセスが可能である。
平29修12 問17】 プログラムの実行時に利用される記憶領域にスタック領域とヒープ領域がある。それらの領域に関する記述のうち,適切なものはどれか。
平29秋 問5】 A,B,C,Dの順に到着するデータに対して,一つのスタックだけを用いて出力可能なデータ列はどれか。
平29修6 問5】 空の状態のキューとスタックの二つのデータ構造がある。次の手続を順に実行した場合,変数xに代入されるデータはどれか。ここで,手続で引用している関数は,次のとおりとする。
平28修7 問5】 A,B,C,Dの順に到着するデータに対して,一つのスタックだけを用いて出力可能なデータ列はどれか。
平28修6 問6】 十分な大きさの配列Aと初期値が0の変数pに対して,関数 f(x) と g() が次のとおり定義されている。配列Aと変数pは,関数 f(x) と g() だけでアクセスが可能である。
平26秋 問5】 加減乗除を組み合わせた計算式の処理において,スタックを利用するのが適している処理はどれか。
平26修7 問5】 十分な大きさの配列Aと初期値が0の変数pに対して,関数 f(x) と g() が次のとおり定義されている。配列Aと変数pは,関数 f(x) と g() だけでアクセスが可能である。
平26修6 問5】 A,B,C,Dの順に到着するデータに対して,一つのスタックだけを用いて出力可能なデータ列はどれか。
平26春 問7】 空の状態のキューとスタックの二つのデータ構造がある。次の手続を順に実行した場合,変数xに代入されるデータはどれか。ここで,手続で引用している関数は,次のとおりとする。
平26修1 問5】 PUSH命令でスタックにデータを入れ,POP命令でスタックからデータを取り出す。動作中のプログラムにおいて,ある状態から次の順で10個の命令を実行したとき,スタックの中のデータは図のようになった。
平25修6 問6】 スタック操作の特徴を表す用語はどれか。
平25春 問6】 図は,逆ポーランド表記法で書かれた式 abcd+++ をスタックで処理するときのスタックの変化の一部を表している。この場合,スタックの深さは最大で4となる。
平24秋 問5】 四つのデータA,B,C,Dがこの順に入っているキューと空のスタックがある。手続pop_enq,deq_pushを使ってキューの中のデータをD,C,B,Aの順に並べ替えるとき,deq_pushの実行回数は最小で何回か。
平24春 問6】 十分な大きさの配列Aと初期値が0の変数pに対して,関数 f(x) と g() が次のとおり定義されている。配列Aと変数pは,関数 f(x) と g() だけでアクセスが可能である。
平23秋 問5】 スタック1,2があり,図の状態になっている。関数fはスタック1からポップしたデータをそのままスタック2にプッシュする。関数gはスタック2からポップしたデータを出力する。
平23修6 問6】 A,B,C,Dの順に到着するデータに対して,一つのスタックだけを用いて出力可能なデータ列はどれか。
平22秋 問5】 A,B,C,Dの順に到着するデータに対して,一つのスタックだけを用いて出力可能なデータ列はどれか。
平22修1 問5】 空の状態のキューとスタックの二つのデータ構造がある。次の手続を順に実行した場合,変数xに代入されるデータはどれか。ここで, データyをスタックに挿入することを push(y), スタックからデータを取り出すことを pop(), データyをキューに挿入することを enq(y), キューからデータを取り出すことを deg(),とそれぞれ表す。
平21秋 問5】 空のスタックに対して次の操作を行った場合,スタックに残っているデータはどれか。ここで,“push x” はスタックへデータを格納し,“pop” はスタックからデータを取り出す操作を表す。
平21春 問5】 関数や手続を呼び出す際に,戻り番地や処理途中のデータを一時的に保存するのに適したデータ構造はどれか。