基本情報技術者試験 -19ページ目
十分な大きさの配列Aと初期値が0の変数pに対して、関数f(x)とg()が次のとおり定義されている。配列Aと変数pは、関数 f(x) と g() だけでアクセス可能である。これらの関数が操作するデータ構造はどれか。

function f(x) {
 p=p+1;
 A[p]=x;
 return None;
}
function g() {
 x=A[p];
 p=p-1;
 return x;
}


ア キュー   イ スタック   ウ ハッシュ   エ ヒープ




【解説】
この2つの関数で使われている 変数 p は 現在の配列の要素数を保持している変数 で、このことを踏まえると、f(x) は、配列の最後に引数であるxを代入する関数、 g()は、配列の最後の要素を返す関数 と考えることができます。

「配列の最後にデータを追加する」 および 「最後に追加されたデータを取り出す」 という2つの操作を合わせると LIFO(Last In First Out,後入れ先出し) のデータ構造が実現されることになります。選択肢の中で LIFO のデータ構造はスタックだけなので これが正解となります。



【解答】イ

スタック1,2があり,図の状態になっている。関数f はスタック1からポップしたデータをそのままスタック2にプッシュする。
関数g はスタック2からポップしたデータを出力する。b,c,d,a の順番に出力するためには,関数をどの順で実行すればよいか。

23-A-5-1

f,f,g,f,f,g,g,g
f,f,g,f,g,f,g,g
f,f,g,f,g,g,f,g
f,f,g,g,f,f,g,g



【解説】
この問題は、スタックの特性が分かっているかどうかの判断を試されています。
スタックの特性とは、 LIFO つまり、最後に格納されたものから順に、取り出されている ということです。

問題文より
関数f は スタック1から取り出したデータをスタック2 に格納する
関数g は スタック2から取り出したデータを出力する
事になります。

つまり、 bcdaの順番に出力するためには、関数g が使われるのですが、その前に
スタック2の最上位に その値が格納されている状態だということになります。

1.スタックの特性から、まず スタック1のデータを取り出すとき、aが、続いてbが 取り出されることになります。

23-A-5-2


2.目的の出力列では、bが 先頭になっていますので、この状態のスタック2から bを出力することになります。

23-A-5-3



3.次にスタック1から取り出すの cになります。 そして2と同様に 出力されます。

23-A-5-4



4.3と同様に スタック1からdを取り出し、スタック2に格納後、 出力されます。

23-A-5-5



5.最後にaを 出力します。

23-A-5-6

ということは、
f,f,g,f,g,f,g,g の順に 実行されます。



【解答】イ

A,B,C,Dの順に到着するデータに対して,一つのスタックだけを用いて出力可能なデータ列はどれか。

ア  A,D,B,C
イ  B,D,A,C
ウ  C,B,D,A
エ  D,C,A,B




【解説】
スタックは、後入れ先出し(FirstIn LastOut)。
A,B,C,Dの順に到着するデータに関し、先に格納されているはずのデータが追い越して出力されることはありません。


順に選択肢をみていきます。
選択肢
ア  Dを出力した後、BがCより先に出力されることはありません。
イ  Dを出力した後、AがCより先に出力されることはありません。
ウ  正解です。 下記に 流れを記します。
エ  Cを出力した後、AがBより先に出力されることはありません。

22-A-5-1

22-A-5-2



【解答】ウ