② コード読み取り 6問
頭の中で実行 してから選択肢をクリック。間違えても解説を読めば必ず腑に落ちます。
Q1. スタックの動き
// スタックに push して、最後に 1 回 pop すると?
push(10);
push(20);
push(30);
int v = pop();
printf("%d\n", v);
出力は?
10
20
30
不定
解説: スタックは 後入れ先出し(LIFO)。
最後に push した 30 が最初に pop で取り出される。
∴ 30。
皿の山と同じ:上に積んだものを上から取る。
Q2. キューの動き
enqueue(10);
enqueue(20);
enqueue(30);
int v = dequeue();
printf("%d\n", v);
出力は?
10
20
30
不定
解説: キューは 先入れ先出し(FIFO)。
最初に enqueue した 10 が最初に dequeue で取り出される。
∴ 10。
レジの行列と同じ:先に並んだ人から会計される。
Q3. バブルソートのループ回数
int a[] = {5, 2, 8, 1, 9}; // N=5
for (int i = 0; i < N - 1; i++) {
for (int j = 0; j < N - 1 - i; j++) {
if (a[j] > a[j+1]) /* swap */;
}
}
内側ループの比較は合計何回?
25 回
10 回
5 回
15 回
解説: i=0 で 4 回、i=1 で 3 回、i=2 で 2 回、i=3 で 1 回。
合計 4+3+2+1 = 10 回。
※ N=5 のとき N(N-1)/2 = 10。N が増えると急速に増える(O(N²))。
Q4. 二分探索の比較回数
// 整列された 1024 個のデータから 1 つ探す
// 二分探索を使うと、最悪何回の比較で見つかる?
最悪の比較回数は?
約 1024 回
約 512 回
約 10 回
約 1 回
解説: 二分探索は 毎回半分に絞る。
1024 → 512 → 256 → 128 → ... → 1 まで 10 回 で 1 つに絞れる(2¹⁰ = 1024)。
計算量は O(log N)。線形探索(最悪 1024 回)に比べて圧倒的に速い。
ただし 整列済み が前提。
Q5. 連結リストの末尾
struct Node *cur = head;
while (cur->next != NULL) {
cur = cur->next;
}
// この時 cur は何を指している?
cur が指すのは?
先頭ノード
2 番目のノード
末尾ノード(next が NULL のノード)
NULL
解説: ループ条件は cur->next != NULL。next が NULL になった瞬間、ループを抜ける。
その時点の cur は 末尾ノード(next が NULL のノード自身)。
※ 条件を cur != NULL にしてしまうと、最後に cur 自身が NULL を指したところで止まる(cur が NULL になる)。
Q6. 選択ソート 1 周目
int a[] = {5, 2, 8, 1, 9};
// 選択ソートを 1 周(最小値を見つけて先頭へ)すると?
1 周目の終了時、配列はどうなる?
{1, 2, 5, 8, 9}(全部整列)
{1, 2, 8, 5, 9}(先頭だけ最小、残りそのまま)
{1, 5, 8, 2, 9}
{2, 5, 8, 1, 9}
解説: 選択ソートは 「最小値を見つけて先頭と交換」を繰り返す。
1 周目: 最小値 1(添字 3)を見つけ、先頭 5 と交換 → {1, 2, 8, 5, 9}。
2 周目以降は a[1] 以降で同じことを繰り返す。