プロが教える店舗&オフィスのセキュリティ対策術

初歩的でツマラナイかもしれません。

import java.util.ArrayList; でスタックを実現するクラス"MyStack"を書きました。
フィールドは private ArrayList<Integer> stack = new ArrayList<Integer>(); のみという条件です。

MyStack.java
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
import java.util.ArrayList;

public class MyStack {
  private ArrayList<Integer> stack = new ArrayList<Integer>();
  
  // データを先頭に追加
  public void push( int item ) {
    stack.add( item );
  }

  // 先頭のデータを取り出す
  public int pop( ) {
    int rtn;
    if( stack.isEmpty() ) {
      System.out.println( "スタックは空です." );
      System.exit( 1 );
    }
    
    rtn = stack.get( 0 );
    stack.remove( 0 );

    return rtn;
  }
}
このMyStackを実行するクラス"MainForMyStack"を書きます。
実行結果は、標準出力に
43210
と出ることを想定しています。
MainForMyStack.java
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
import java.util.ArrayList;

public class MainForMyStack {

  public static void main(String[] args) {

    MyStack stack = new MyStack();

    // 0,1,2,3,4 をスタックに追加
    for( int i=0; i < 5; i++ ) {
      stack.push( i );
    }
    // スタックのデータを先頭から取り出す
    for( int i=0; i < stack.size(); i++ ) {
      System.out.print( stack.pop() );
    }
  }
}

さて、MainForMyStack.java の
i < stack.size(); の箇所でエラーが出るのはなぜでしょう?

どなたかご教授の方お願いします。

A 回答 (2件)

コンパイルエラーの話だよね?



size()メソッドはArrayList<E>には実装されているけど
MyStackクラスには実装していないから(継承したわけでもないし)
    • good
    • 0
この回答へのお礼

早速ありがとうございます。

仰るとおりですね。
最近Javaを独学し始めたもので。

お礼日時:2009/08/09 16:11

あと指摘し忘れたこと。



キュー(FIFO)じゃなくてスタック(LIFO)だよね?

//× addメソッドでデータを先頭に追加
//○ addメソッドでデータを最後に追加
public void push( int item ) {
  stack.add( item );
}
このコードだと
stack.push(0)
stack.push(1)

{0, 1}
になって
System.out.println(stack.pop()) // {1} → 0が出力
stack.pop {} // {} → 1が出力

となるのでやりたいこととは違うだろう。

●あと,

// 1回目に評価されるときはstack.size() == 5, i == 0
// 2回目に評価されるときはstack.size() は 4, i == 1
// 3回目に評価されるときはstack.size() は 3, i == 2
// 4回目に評価されるときはstack.size() は 2, i == 3(よって中身は実行されない)

for( int i=0; i < stack.size(); i++ ) {

System.out.print( stack.pop() );

}

となるので,size()だけ実装した状態で(popメソッドを修正せずに)実行すると012となる。

while(stack.size() != 0){
System.out.println(stack.pop());
}
とかの方がいいのでは?(どちらの場合も,空である,とは出力されない)

●あとスタックが空の時は
IndexOutOfBoundsException
等の例外を投げる形にした方が便利じゃないかな,と思う。
    • good
    • 0
この回答へのお礼

なるほど。

pushメソッドを↓に変更し、MainForMyStack.java のpop()を実行するループも↓に変えました。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  public void push( int item ) {
    stack.add( 0, item );
  }

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    for( int i=0; i < 5; i++ ) {
      System.out.print( stack.pop() );
    }

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
で、期待した結果となりました。
>●あとスタックが空の時は
>IndexOutOfBoundsException
>等の例外を投げる形にした方が便利じゃないかな,と思う。
は、今後の参考にさせていただきます。

ありがとうございました。

お礼日時:2009/08/09 16:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!