問題 #5 ・ リスト・スタック・キュー ・ 難易度 3
二つのスタックを用いて、先入れ先出し(FIFO)のキューを実現するクラス StackQueue を次のように定義する。メソッド「追加」は要素をキューに追加し、メソッド「取出し」はキューに最も早く追加された要素を取り出して返す。プログラム中の〔 a 〕と〔 b 〕に入れる字句の正しい組合せを、選択肢の中から選べ。 ここで、スタックに対する操作は次のとおりである。 ・push:スタックの先頭に値を追加する。 ・pop:スタックの先頭から値を取り出して返す。 ・「スタックが空である」は、スタックに要素が一つもないとき true を返す。 次の実行プログラムにおいて、取出しの結果が順に 10、20、30 と返されるように正しく動作する必要がある。 〔実行プログラム〕 StackQueue: q ← StackQueue() q.追加(10) q.追加(20) q.取出し() の戻り値を表示する /* 10 と表示 */ q.追加(30) q.取出し() の戻り値を表示する /* 20 と表示 */ q.取出し() の戻り値を表示する /* 30 と表示 */
○クラス StackQueue整数型のスタック: inStack整数型のスタック: outStack○コンストラクタ StackQueue()inStack ← 空のスタックoutStack ← 空のスタック○追加(整数型: value)inStack に value を push する○整数型: 取出し()if (〔 a 〕)while (〔 b 〕)outStack に (inStack から pop した値) を push するendwhileendifreturn outStack から pop した値
この問題は、二つのスタックでキュー(FIFO)を実現する典型的なデータ構造の問題である。 【アルゴリズムの考え方】 要素の追加は inStack に push する。取り出し時に outStack が空であれば、inStack の全要素を outStack に移し替える。スタックは後入れ先出し(LIFO)なので、移し替えると順序が反転し、最初に追加した要素が outStack の先頭に来る。outStack に要素が残っていれば移し替えは不要である。 【トレース】 (1) q.追加(10): inStack=[10], outStack=[] (2) q.追加(20): inStack=[10,20], outStack=[] (3) q.取出し(): outStack が空である → true → if に入る while(inStack が空でない): pop 20 → outStack に push: inStack=[10], outStack=[20] pop 10 → outStack に push: inStack=[], outStack=[20,10] outStack から pop → 10 を返す。outStack=[20] ✓ (4) q.追加(30): inStack=[30], outStack=[20] (5) q.取出し(): outStack が空である → false → if をスキップ outStack から pop → 20 を返す。outStack=[] ✓ (6) q.取出し(): outStack が空である → true → if に入る while(inStack が空でない): pop 30 → outStack に push: inStack=[], outStack=[30] outStack から pop → 30 を返す。outStack=[] ✓ 以上により、取出しの結果は 10、20、30 の順となり、FIFO として正しく動作する。よって正解はアである。
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。