配列で作るスタック 問題01

標準 レベル:基礎 / このアルゴリズムの解説を読む

練習モードは行番号つきで順に解く形式、本番形式は公開問題と同じ体裁の1問です。

大域の配列 stack と変数 top でスタックを表す。手続 push は値を積み、関数 pop は最後に積んだ値を取り出して返す。関数 test は、取り出した値を順に並べた整数を返す。配列の要素番号は 1 から始まる。

次のプログラムを test() で呼び出す。

〔プログラム〕

1大域: 整数型の配列: stack ← {3 個の 0}
2大域: 整数型: top ← 0
3
4○push(整数型: x)
5 top ← top + 1
6 stack[top] ← x
7
8○整数型: pop()
9 整数型: v ← stack[top]
10 top ← [ a ]
11 return v
12
13○整数型: test()
14 整数型: r
15 push(6)
16 push(5)
17 r ← pop()
18 push(2)
19 r ← r × 10 + pop()
20 r ← r × 10 + pop()
21 return r
ヒント1:トレース表の枠を見る

この列で表を作り、文を1つ実行するたびに1行足していきます。

#行したことstacktoprxv
ヒント2:最初の6ステップを見る

続きを同じ要領で書いていきます。太字は、その文で値が変わった変数です。

#行したこと手続stacktoprxv
11宣言(main){0, 0, 0}————
22宣言(main){0, 0, 0}0———
314宣言test{0, 0, 0}0未定義——
45代入 push{0, 0, 0}1—6—
56代入 push{6, 0, 0}1—6—
615呼出しtest{6, 0, 0}1未定義——

設問1

test() を呼び出すと戻り値は 526 になる。プログラム中の [ a ] に入れる正しい答えはどれか。

解答群

正解:ウ top - 1

  • それぞれの選択肢を空欄に入れて、実際に動かした結果は次のとおりです。
  • 「top」→ 戻り値は 522
  • 「top - 2」→ 途中で止まる(配列の範囲外です(要素番号 -1、要素数 3))
  • 「top - 1」→ 戻り値は 526(正解)
  • 「top + 1」→ 途中で止まる(配列の範囲外です(要素番号 4、要素数 3))

設問2

6行目を3回目に実行した直後の、変数 stack の値はどれか。

解答群

正解:エ {6, 2, 0}

  • 6行目は全部で3回実行されます。
  • 実行した直後の stack は、順に {6, 0, 0} → {6, 5, 0} → {6, 2, 0} です。
  • 3回目の直後なので、答えは {6, 2, 0} です。

設問3

10行目を1回目に実行した直後の、変数 top の値はどれか。

解答群

正解:イ 1

  • 10行目は全部で3回実行されます。
  • 実行した直後の top は、順に 1 → 1 → 0 です。
  • 1回目の直後なので、答えは 1 です。

本番形式

問 次のプログラム中の[ a ]に入れる正しい答えを,解答群の中から選べ。

大域の配列 stack と変数 top でスタックを表す。手続 push は値を積み,関数 pop は最後に積んだ値を取り出して返す。関数 test は,取り出した値を順に並べた整数を返す。配列の要素番号は 1 から始まる。

関数 test を test() として呼び出すと,戻り値は 526 となる。

〔プログラム〕

大域: 整数型の配列: stack ← {3 個の 0}
大域: 整数型: top ← 0
○push(整数型: x)
top ← top + 1
stack[top] ← x
○整数型: pop()
整数型: v ← stack[top]
top ← [ a ]
return v
○整数型: test()
整数型: r
push(6)
push(5)
r ← pop()
push(2)
r ← r × 10 + pop()
r ← r × 10 + pop()
return r

解答群

正解:ア top - 1

  • それぞれの選択肢を空欄に入れて,実際に動かした結果は次のとおりです。
  • 「top - 1」→ 戻り値は 526(正解)
  • 「v - 1」→ 途中で止まる(配列の範囲外です(要素番号 5、要素数 3))
  • 「top」→ 戻り値は 522
  • 「top + 1」→ 途中で止まる(配列の範囲外です(要素番号 4、要素数 3))
  • 「top - 2」→ 途中で止まる(配列の範囲外です(要素番号 -1、要素数 3))

解説

スタックは「最後に積んだ値から先に取り出す」入れ物です。top は、いちばん上の値が入っている要素番号です。 6、5 を積んで 1 つ取り出し、2 を積んでから 2 つ取り出します。取り出した順に並べると 526 です。

行番号つきのプログラム

1大域: 整数型の配列: stack ← {3 個の 0}
2大域: 整数型: top ← 0
3
4○push(整数型: x)
5 top ← top + 1
6 stack[top] ← x
7
8○整数型: pop()
9 整数型: v ← stack[top]
10 top ← top - 1
11 return v
12
13○整数型: test()
14 整数型: r
15 push(6)
16 push(5)
17 r ← pop()
18 push(2)
19 r ← r × 10 + pop()
20 r ← r × 10 + pop()
21 return r

トレース表(全ステップ)

太字は、その文で値が変わった変数です。設問が指している行は黄色、その回は濃い黄色、変数は青い列で示します。

#行したこと手続stacktoprxv
11宣言(main){0, 0, 0}————
22宣言(main){0, 0, 0}0———
314宣言test{0, 0, 0}0未定義——
45代入 push{0, 0, 0}1—6—
56代入 push{6, 0, 0}1—6—
615呼出しtest{6, 0, 0}1未定義——
75代入 push{6, 0, 0}2—5—
86代入 push{6, 5, 0}2—5—
916呼出しtest{6, 5, 0}2未定義——
109宣言 pop{6, 5, 0}2——5
1110代入 pop{6, 5, 0}1——5
1211戻る(5) pop{6, 5, 0}1——5
1317代入test{6, 5, 0}15——
145代入 push{6, 5, 0}2—2—
156代入 push{6, 2, 0}2—2—
1618呼出しtest{6, 2, 0}25——
179宣言 pop{6, 2, 0}2——2
1810代入 pop{6, 2, 0}1——2
1911戻る(2) pop{6, 2, 0}1——2
2019代入test{6, 2, 0}152——
219宣言 pop{6, 2, 0}1——6
2210代入 pop{6, 2, 0}0——6
2311戻る(6) pop{6, 2, 0}0——6
2420代入test{6, 2, 0}0526——
2521戻る(526)test{6, 2, 0}0526——