ITパスポート 2018年 秋期 問76
問題文
複数のデータが格納されているスタックからのデータの取出し方として、適切なものはどれか。
選択肢
ア:格納された順序に関係なく指定された任意の場所のデータを取り出す。
イ:最後に格納されたデータを最初に取り出す。(正解)
ウ:最初に格納されたデータを最初に取り出す。
エ:データがキーをもっており、キーの優先度でデータを取り出す。
🔒 解説は解答すると表示されます
複数のデータが格納されているスタックからのデータの取出し方として、適切なものはどれか。【ITパスポート 解説】
正解の理由
選択肢の中で「最後に格納されたデータを最初に取り出す」とある イ が正解です。これはスタック(stack:データを積み重ねて扱う構造)で採用される取り出し順で、LIFO(Last In, First Out:後入れ先出し)と呼ばれます。スタックは上に積んだものを上から取るイメージで、最後に入れた要素が最初に出てきます。よく使われる操作名は「プッシュ(push:追加)」と「ポップ(pop:取り出す)」です。
身近な例を挙げると、お皿を積み重ねた状態を想像してください。最後に置いたお皿が一番上にあり、まずそれを取ります。これがスタック(LIFO)の挙動です。
解法ステップ
- 問題文のキーワードを確認:「最後に格納された」「最初に取り出す」など後入れ先出しの表現があるか。
- 用語と対応づける:
- 「最後に入れたものを最初に出す」→ スタック(LIFO)
- 「最初に入れたものを最初に出す」→ キュー(FIFO:First In, First Out)
- 「キーや優先度で取り出す」→ 優先度付きキュー(priority queue)
- 「任意の場所を取り出す」→ 配列やリスト、ハッシュ(ランダムアクセス)
- 当てはまる選択肢を選ぶ:上の対応より、イ を選択する。
選択肢別の誤答解説
-
ア: 格納された順序に関係なく指定された任意の場所のデータを取り出す。
→ これはランダムアクセスの説明です。配列(array)やリスト、ハッシュテーブル(hash table:キーで直接取り出せる構造)が該当します。スタックは順序に従ってしか取り出せないので誤りです。 -
イ: 最後に格納されたデータを最初に取り出す。
→ これがスタックの基本動作(LIFO)で正解です。 -
ウ: 最初に格納されたデータを最初に取り出す。
→ これはキュー(queue:先入れ先出し、FIFO)を説明しています。列に並んだ順に処理する行列や行列待ち(列に並ぶ発券機の列)をイメージすると分かりやすいです。 -
エ: データがキーをもっており、キーの優先度でデータを取り出す。
→ これは優先度付きキュー(priority queue)です。例えばタスク管理で重要度が高い順に実行したい場合に使います。スタックの説明とは異なります。
よくある誤解
-
スタックとキューを混同する:
「先に入れたものが先に出る」と「後に入れたものが先に出る」を逆に覚えてしまいがちです。覚え方:FIFO(First In First Out)=先入先出(キュー)、LIFO(Last In First Out)=後入先出(スタック)。 -
スタックは「順序が保存される配列」と同じだと思う:
配列は任意の位置に直接アクセスできますが、スタックはトップ(山の一番上)からしか取り出せません。用途が違うので混同しないこと。 -
「スタックは遅い/早い」の誤解:
実装次第ですが、基本操作(push/pop)は通常O(1)で高速です。誤解は実装方法やメモリ管理と混ぜて考えてしまうことから生じます。
補足コラム
-
実際の利用例:
- 関数呼び出しの管理(コールスタック):関数AがBを呼ぶとBの情報がスタックに積まれ、Bが終わるとその情報がポップされてAに戻る。
- ブラウザの「戻る」ボタン:訪れたページ履歴をスタックとして扱うことが多く、直近のページから戻る。
- テキストエディタの「元に戻す(Undo)」操作:操作の履歴をスタックに積んでいき、直近の操作から取り除くことで戻る。
-
プログラミング例(Python):
# Pythonでの簡単なスタック例(リストを使用)
stack = []
# push(プッシュ)
stack.append(10)
stack.append(20)
stack.append(30)
# pop(ポップ): 最後に入れた30が先に出る
print(stack.pop()) # 30
print(stack.pop()) # 20
print(stack.pop()) # 10
FAQ
Q1. スタックとキュー、どちらを覚えればいいですか?
A1. 両方とも基本的で出題頻度も高いです。キーワードで区別する練習(最後に入れた→スタック、最初に入れた→キュー)をしておくと良いです。
A1. 両方とも基本的で出題頻度も高いです。キーワードで区別する練習(最後に入れた→スタック、最初に入れた→キュー)をしておくと良いです。
Q2. LIFOやFIFOの英語は何の略ですか?
A2. LIFO = Last In, First Out(最後に入ったものが最初に出る)。FIFO = First In, First Out(最初に入ったものが最初に出る)。
A2. LIFO = Last In, First Out(最後に入ったものが最初に出る)。FIFO = First In, First Out(最初に入ったものが最初に出る)。
Q3. スタックの主な操作は何ですか?
A3. push(追加)、pop(取り出す)、peek/top(中身を覗くだけで取り出さない)です。
A3. push(追加)、pop(取り出す)、peek/top(中身を覗くだけで取り出さない)です。
Q4. 試験で出やすいポイントは?
A4. 「後入れ先出し」「先入れ先出し」といった日本語表現を見て、どのデータ構造か判断する問題が多いです。実世界の例(皿、列、優先度)を結びつけて覚えると有利です。
A4. 「後入れ先出し」「先入れ先出し」といった日本語表現を見て、どのデータ構造か判断する問題が多いです。実世界の例(皿、列、優先度)を結びつけて覚えると有利です。
関連キーワード: スタック、LIFO(Last In, First Out)、プッシュ、ポップ、キュー、FIFO(First In, First Out)、優先度付きキュー、配列、後入れ先出し、先入れ先出し、コールスタック、ブラウザ戻る、Undo

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

