技術コラム集

スタックってなあに?(1)

「昨日、風邪引いて会社休んじゃったから、仕事がスタックしちゃって」

というような会話を聞いたことがあるんじゃないかな。
「スタック」は「積み重ねる」という意味の単語だから、わりとイメージしやすいよね。

でも、組込み業界では以下のような使い方をするんだ。

「スタックがあふれて例外になっていたんですよ」
「このタスクのスタックサイズはどれくらいにすればいいですか?」
「スタックのトレースはとれないのか」

・・・なんだか雰囲気が違うよね。(^-^;これらはどういうことを意味しているんだろうか。

スタックのおさらい

大学などで情報工学を勉強したことのある人なら、
「スタック」といえば「アルゴリズムとデータ構造」の授業を思い出すんじゃないかな?

「スタック」は、入れる口と取り出す口が等しい袋のようなデータ構造なんだ。
以下に、スタック操作の例を示してみよう。

[ がスタックの底を示しているんだけど、右方向に積みあがっていく様子がわかるかな?

スタックに要素を追加することを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が得られることになる。

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

スタックってなあに?(2)へ続く

六の巻:マルチタスクとは 八の巻:メモリをこわしてみましょう

このページの上へ