pafuイーランスクール 学んでできる

メニューへ戻る

Java 基礎問題10 平成14年度春期問8 解説

問題の確認

解説
(問題概要)
データ構造「スタック」に関する問題。
(前提知識)
●スタックの基本的知識
●java.ioの入力ストリームに関する知識

(解説)
(1)スタックとは
まず、「スタック」とは、「後からに格納したデータを最初に取り出す」という「後入れ先出し(LIFO)」のデータ構造です。操作としては、PUSHとPOPがあります。
●PUSH スタックにデータを格納する。
●POP スタックからデータを取り出す。
(2)プログラムの流れ
プログラムの流れとしては、クラスIntStackでスタックでスタックを実現するための3つのメソッドを定義しています。実行は、クラスTestIntStackより行っています。ここの流れとしては、IntStackクラスのオブジェクトを作成して、標準入力より、1行分読み込み、その内容を整数型へ変換(Integer.parseInt(input))しています。この処理をループしています。次に、その内容をpopメソッドを利用して出力しています。
(a)
このプログラムでは、スタックを配列の「content」で実現しています。こでは、配列の拡張処理の部分です。contensの要素数とn_elementsが等しい時に拡張する必要があります。ここで、定数「INCREMENT(5)」分、増加して配列「newContent」を作成しています。次に、現在の要素数分ループ処理を行い、(a)を求められています。これは、単純に、content配列の内容をnewContentへセットしています。従って解答は、「ウ」となります。その後、capacityとcontentの内容を更新しています。
(b)
ここでは、実際にスタックへ引数「value」をセットする処理です。スタックの配列「content」でいくつまでスタックされたかは、変数「n_elements」で管理されています。よって、スタックする際は、この変数を「+1」する必要があります。よって正解は、content[n_elements++]となり「オ」が正解となります。ここでのポイントは、変数「n_elements」は、例えば、スタックの3番目に格納した場合は、「3」となっていることに注目して下さい。(次に格納する要素の値となっている。つまり、+1としている)
また、解答欄の「キ」のcontent[n_elements+1]の場合も正しいように思えます。これは、n_elementsの初期値が「0」ですから、+1はしていますが、変数「n_elements」へ内容をを格納していません。従って、n_elementsの値は、永遠に「0+1=1」となり、常に、n_elementsは「0」のままとなります。
別の記述としては、
n_elements = n_elements + 1;(または、n_elements++;)
content[n_elements] = value;
でも問題なく動作します。
(c)
popメソッドを確認するとpeekメソッドを利用して変数n_elemnetsを-1して、値を取得しています。peekは、問題文にあるように「直前にスタックへ格納したデータを参照する」ものです。上記(b)のポイントで記載した通り、変数「n_elements」は、次に格納(pash)する要素数+1となっています。よって、直前の要素数は、n_elements-1となります。よって、content[n_elemens-1]となり、正解は、「ウ」となります。
(d)
プログラム2のスタックのオブジェクト「stack」へ標準入力の内容をpushして、最後にまとめて、popにより出力するものです。(d)では、この出力の条件を求められています。ポイントは、popメソッドによって、n_elementsが「0」の時は、空のスタックになるということです。よって、プログラム1で、empty()メソッドが定義されています。これは、スタックが空の時に「true」を返します。よって解答は、スタックが空でない時の条件「!stack.empty()」となり、正解は「エ」となります。
(最後に)
スタックを配列によって実現したプログラムです。スタックについて知らなくても問題文より把握出来るかと思います。また、標準入力についても問題文に説明があるため、こちらも知らなくとも理解は可能かと思います。この問題のポンイトは、変数「n_elements」の役割を見抜くことが重要です。

pafu 投稿

メニューへ戻る

pafuイーランスクール

pafuイーランスクール 学んでできる