「昨日、風邪引いて会社休んじゃったから、仕事がスタックしちゃって」
というような会話を聞いたことがあるんじゃないかな。
「スタック」は「積み重ねる」という意味の単語だから、わりとイメージしやすいよね。
でも、組込み業界では以下のような使い方をするんだ。
「スタックがあふれて例外になっていたんですよ」
「このタスクのスタックサイズはどれくらいにすればいいですか?」
「スタックのトレースはとれないのか」
・・・なんだか雰囲気が違うよね。(^-^;これらはどういうことを意味しているんだろうか。
大学などで情報工学を勉強したことのある人なら、
「スタック」といえば「アルゴリズムとデータ構造」の授業を思い出すんじゃないかな?
「スタック」は、入れる口と取り出す口が等しい袋のようなデータ構造なんだ。
以下に、スタック操作の例を示してみよう。


[ がスタックの底を示しているんだけど、右方向に積みあがっていく様子がわかるかな?
スタックに要素を追加することをPush、一番上の要素を取り出すことをPopというんだ。
また、最後に入った要素が最初に取り出されるので、スタックはLIFO(Last-In, First-Out)とも呼ばれる。
ちなみに、スタックと並んで教えてもらうデータ構造に「キュー」があり、
これは、入れる口と取り出す口が異なる筒みたいなものだ。
こちらは最初に入った要素が最初に取り出されるので、FIFO(First-In, First-Out)ということになる。
スタックの例として、本などでは、逆ポーランド記法がよく取り上げられる。
逆ポーランド記法とはカッコがいらない計算表記法で、例えば、
53+
と書くと、5+3の意味になるんだ。
((5+3)*2-4)/3=
というような加減乗除が混ざった式は、通常は演算順序を指定するためにカッコが必要だよね。
でも、逆ポーランド記法を使うと、
53+2*4-3/=
という風にカッコを使わずに表現できるんだ。
演算子を後ろに書くのがポイントで「後置記法」とも呼ばれている。
この計算方法をプログラムで実現するのに「スタック」の考え方が使えるんだ。
つまり、
・数値だったらスタックにPushする
・+、− 、× 、÷ の演算子がきたら2回Popする
・演算したら答えをスタックにPushする
・=がきたら1回Popして答えとする
という手順(こういうのをアルゴリズムという)を繰り返すと、
計算結果が得られるというものなんだ。わかるかな?
上記の例((5+3)*2-4)/3=の場合を、順番に見てみよう。逆ポーランド記法では、53+2*4-3/=となる。

で、答え4が得られることになる。
スタックの構造と使い方はわかったかな?次回は、これをふまえて組込みでのスタックについて説明するよ。
