基本情報技術者試験「スタック・キュー」の問題
空のスタックに対し、文字 'P' は次の数を push する操作、文字 'o' は pop する操作(取り出すだけで値は捨てる)を表す。push する数は左から 1, 2, 3, 4, 5 の順に供給される(P が現れるたびに次の数を積む)。操作列 ops = "PPoPPPo"(左から1文字ずつ)を実行したあと、スタックの内容(底→頂上)はどれか。
○手続: run(文字型の配列: ops)
スタック: stk // 空で開始
整数型: next ← 1 // 次に push する数
整数型: i
for (i を 1 から opsの要素数 まで 1 ずつ増やす)
if (ops[i] が 'P')
stk.push(next)
next ← next + 1
else
stk.pop()
endif
endforア{1, 3, 4}(底→頂上)
イ{1, 2, 3}
ウ{1, 4, 5}(pop 対象を取り違えた並び)
エ{2, 3, 4}(底→頂上)
正解
ア.{1, 3, 4}(底→頂上)
供給順 1,2,3,4,5 を P のたびに積み、o のたびに頂上を捨てる。手順を追うと 2 と 5 が捨てられ、底から 1, 3, 4 が残るため アが正しい。
?選択肢ごとの解説
ア ○供給順 1,2,3,4,5 を P のたびに積み、o のたびに頂上を捨てる。手順を追うと 2 と 5 が捨てられ、底から 1, 3, 4 が残るため アが正しい。
イ ×pop 操作を無視して push した順の先頭 3 つ 1,2,3 を残した、'o' を反映しない誤りである。
ウ ×最後に push した 5 を捨てた直後の状態を取り違え、捨てた 5 を残し中間の 3 を落とした誤りである。
エ ×最初の 1 を捨てたと誤認して底を 2 にずらした、pop 対象(頂上)を取り違えた誤りである。
✎くわしく
push/pop 混在系列では『P で供給順の次値を積む』『o で頂上を捨てる』を厳密に時系列で追う必要がある。捨てられるのは常に直近に積まれた頂上であり、底の要素は早く積まれたものが残る。
✓本番での押さえどころ
試験のコツ
next の値と stk の中身を 2 列で並べ、P と o を 1 文字ずつ反映して頂上を追う。
覚え方
『P で積む数は供給順、o で消すのは頂上』と 2 点を固定する。
よくある誤り
pop が底から取り出すと誤解し、最初に積んだ値を捨ててしまうミスが多い。
アルゴリズムとプログラミングの他の問題
次の擬似言語で表される手続 sumOdd を、引数として要素数 5 の整数型の配列 {12, 125, 1008,…次の擬似言語は、整数型の配列 arr に対して隣接交換を行う手続の一部であり、外側ループの 1 回目(1…次の擬似言語は昇順に整列された配列 arr に対する二分探索の手続である。arr = {2, 4, 6, 8, 10,…次の擬似言語で表される再帰手続 f を、引数 n = 20 で呼び出したとき、戻り値として返される値はどれか。
```…単方向連結リストの各ノードはメンバ val(整数)と next(次ノードへの参照。なければ NULL)をもつ。先頭ノード…スタックに対する push(積む)と…
この問題を、AIの8-ways解説つきで。
無料ではじめる →基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。
ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0104