02 スタック(stack)

【知識】

後入れ先出し(LIFO:Last-In First-Out)。最後に入れたものが最初に出る。 イメージは「積み上げた本」や「バネ式の皿入れ」。

push ↓
(積む)
pop ↑
(取り出す)
C
B
A
最後に入れた C が最初に出る(LIFO)。出入り口は一番上だけ。

【演習】理解度チェック

Q1(H22春 問5 / H16春・H29秋でも出題)★頻出

A, B, C, D の順に到着するデータに対して、一つのスタックだけを用いて出力可能なデータ列はどれか。

解説を表示

正解:ウ(C, B, D, A)

各選択肢を、「push で積む/pop で出す」を実際になぞって確かめる。

push A, push B, push C     スタック:[A,B,C](上=C)
pop → C                    出力: C
pop → B                    出力: C,B
push D                     スタック:[A,D](上=D)
pop → D                    出力: C,B,D
pop → A                    出力: C,B,D,A  ✓

なぜ他はダメか(先に積んだものは後でしか出せないが判定基準):

▼速解法:「先に入れた文字は、後に入れた文字より先には出てこられない」。"A が早く出てくる" 選択肢は疑ってかかる(Aは最初に積まれるので普通は最後)。

過去問道場で確認

Q2 ★push/pop のトレース

空のスタックに対し、次の操作を順に行う。取り出される(pop される)順はどれか。

push(1), push(2), pop, push(3), pop, pop
▶ トレース表を見る
操作スタック(右が上)出力
push(1)1
push(2)1, 2
pop12
push(3)1, 32
pop12, 3
pop(空)2, 3, 1
解説を表示

正解:イ(2, 3, 1)

pop は必ず「今の一番上」。1つずつ上を追うだけ。上のトレース表参照。

▼ 解説つきの類題を探す:過去問道場・分野別「データ構造」

Q3 ★逆ポーランド記法(後置記法)とスタック

数式 3 4 + 5 ×(後置記法)をスタックで計算した結果はいくつか。

解説を表示

正解:ウ(35)

後置記法は「数字はスタックに積む/演算子が来たら上2つを取り出して計算し、結果を積む」。

  1. 3 を積む → [3]
  2. 4 を積む → [3, 4]
  3. + → 3+4=7 を積む → [7]
  4. 5 を積む → [7, 5]
  5. × → 7×5=35 → [35]

電卓・コンパイラの式計算は、このスタックの後入れ先出しを利用している。

▼ 速解法
後置記法 → ふつうの数式は、A B +A + B の関係(演算子を2項の間にはさむ)だけ覚えればOK。
演算子が来るまで左から進め、直前の2項を取り出して計算し、結果をまた項として置く。これを式の終わりまで繰り返す。
この問題なら 3 4 +3+4=7、続く 7 5 ×7×5=35

▼ 解説つきの類題を探す:過去問道場・分野別「データ構造」

Q4(H26春 問7)★スタックとキューの複合・頻出 は、 03_キュー の理解度チェックで扱います(正解:イ b)。

【練習リンク】