後に入れたデータが先に取り出されるデータ構造 (以下, スタックという) がある。これを用いて, 図に示すような, 右側から入力されたデータの順番を変化させて, 左側に出力する装置を考える。この装置に対する操作は次の3通りである。 ① 右側から入力されたデータをそのまま左側に出力する。 ② 右側から入力されたデータをスタックの1番上に積み上げる。 ③ スタックの1番上にあるデータを取り出して左側に出力する。 この装置の右側から順番にデータ A, B, C, D を入力した場合に, この①~③の操作を組み合わせても, 左側に出力できない順番はどれか。
平成28年度 秋期 ITパスポート試験 問92
テクノロジ系アルゴリズムとプログラミング › データ構造
这道题的解析和你的作答记录。
問92
頻出度★☆☆
解説
問 92栈是后进先出 (LIFO)
错误ア
「B, A, D, C」可以构造出来。压入 A,再压入 B,按 B→A 的顺序取出 (B, A);接着压入 C,再压入 D,按 D→C 的顺序取出 (D, C),就得到 B, A, D, C。因为能够输出,所以这不是正确答案。
错误イ
「B, D, C, A」可以构造出来。压入 A,再压入 B 并取出 B (B);压入 C,再压入 D,按 D→C 的顺序取出 (D, C);最后取出剩下的 A (A),就得到 B, D, C, A。因为能够输出,所以这不是正确答案。
错误ウ
「C, B, D, A」可以构造出来。依次压入 A、B、C,按 C→B 的顺序取出 (C, B);接着压入 D 并取出 (D);最后取出剩下的 A (A),就得到 C, B, D, A。因为能够输出,所以这不是正确答案。
- エ
正解 栈是「后进先出 (LIFO)」,越晚压入的数据越先被取出。数据从右侧按 A→B→C→D 的顺序到达,对每个数据都可以选择「直接输出 (①)」「压入 (②)」「取出并输出 (③)」。若要构造选项エ「C, D, A, B」,为了先输出 C,必须先把 A、B 压入,再压入 C 并取出;此时栈中从底往上还留着 A、B,B 位于栈顶。接着压入 D 并取出,可以输出 D;但随后想输出 A 时,A 被压在 B 的下面,只要不取出 B 就无法取出 A。也就是说,B 必然先于 A 被取出,因此无法构造以「A, B」结尾(即 A 排在 B 前面)的顺序。所以エ是无法输出的顺序,这就是正确答案。
ここがポイント
- 栈是后进先出 (LIFO)。先压入的数据,必须等压在它上面的数据全部取出后,才能被取出。
- 判断某个顺序能否用栈重排,要看想输出的元素当前是否位于栈顶(或者尚未输入)。被压在下面的元素,无法先于压在它上面的元素被取出。
用語