ArrayListでスタックを実現するクラスMyStackを書く

このQ&Aのポイント
  • 初歩的でツマラナイかもしれません。
  • MyStackというクラスを作成し、ArrayListを使用してスタックを実現します。
  • MainForMyStackクラスの中で、stack.size()の部分でエラーが出る理由はなぜでしょうか?
回答を見る
  • ベストアンサー

ArrayList でスタックを

初歩的でツマラナイかもしれません。 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(); の箇所でエラーが出るのはなぜでしょう? どなたかご教授の方お願いします。

  • brosis
  • お礼率94% (100/106)
  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

あと指摘し忘れたこと。 キュー(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 等の例外を投げる形にした方が便利じゃないかな,と思う。

brosis
質問者

お礼

なるほど。 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 >等の例外を投げる形にした方が便利じゃないかな,と思う。 は、今後の参考にさせていただきます。 ありがとうございました。

その他の回答 (1)

回答No.1

コンパイルエラーの話だよね? size()メソッドはArrayList<E>には実装されているけど MyStackクラスには実装していないから(継承したわけでもないし)

brosis
質問者

お礼

早速ありがとうございます。 仰るとおりですね。 最近Javaを独学し始めたもので。

関連するQ&A

  • クラス→スタックを使う

    初歩的なとこですがすでに着いていけず困っています。 問題は、  下記のプログラムにおいて、スタックへ整数10を入れるには、push(10)としてメソッドpushを呼び出す。逆に、スタックから値を取り出すには、pop()メソッドを呼び出す。また、現在のスタックの先頭位置(スタックポインタsp)は、メソッドgetSP()を呼び出すことで得られる。今、整数10と20をこの順にスタックへ入れた後、スタックから先頭の要素(整数)を取り出す。ただし、取り出した値は出力する必要はない。そして、これらの操作(3回ある)が終わる毎に、その時のスタックポインタspの値を出力する。  このような動作をするようにmainメソッドを完成させ、実行結果を確かめなさい。 class Stack { int [] stack = new int[10]; int sp = 0; void push(int n){ if(sp < stack.length){ stack[sp] = n; sp++; } } void pop(){ if(sp > 0)sp--; } int getSp(){ return sp; } public static void main(String[] args){ // <この部分を完成させなさい> } } 宜しくお願いします!!  

    • ベストアンサー
    • Java
  • このプログラムが実行できません。

    スタックの動きを再現するプログラムを作ったのですが、エラーがでます。プログラムは以下に示します。 メインクラス public class mainStack { public static void main(String[] args) { StackTest stack=new StackTest(); stack.push("AAAAA"); stack.push("BBBBB"); } } スタックのクラス import java.util.ArrayList; @SuppressWarnings("unchecked") public class StackTest implements Stack { ArrayList list=new ArrayList(); public int AA=0; public boolean empty() { if(list.isEmpty()==true){ return true; } else{ return false; } } public void pop() { list.remove(AA); AA--; } public void push(String element) { list.add(element); AA++; } public void top(){ System.out.println(list.get(AA)); } } 何故かlist.add()のところにエラーが出てしまいます。是非分かる方解答お願いします。

    • ベストアンサー
    • Java
  • スタックで成績表を作るプログラム。

    成績表を作りたい。Studentのクラスを要素とするクラスStackを完成させてプログラムが動作するようにせよという問題なのですがprivateの物をどうやって要素にすればよいのでしょうか? class Student { private int id; private String name; private int eng; private int math; private int kokugo; Student(int i,String nm,int e,int m,int k) { id=i;name=nm;eng=e;math=m;kokugo=k; } void show(){ System.out.println("("+id+","+name+","+ eng+","+ math+","+ kokugo+")"); } } class Stack { } class Sample { public static void main(String[] args) { Stack ss=new Stack(3); ss.push(new Student(1,"A",10,10,10)); ss.push(new Student(2,"B",20,10,10)); ss.push(new Student(3,"C",30,10,10)); ss.push(new Student(4,"D",40,10,10)); ss.pop(); ss.pop(); ss.pop(); ss.pop(); } }

    • ベストアンサー
    • Java
  • ArrayListを利用する問題

    問題 1.ArrayListのオブジェクトを生成する。 2.「何回入力しますか?」と出力し、標準入力をおこなう。 3.2で入力した回数分、以下の処理を繰り返す。 「n個目の値を入力してください」と出力し、標準入力を行う。(n=ループ回数) 入力された値をArrayListへ格納する。 4.ArrayListのサイズ分、以下の処理を繰り返す。 ArrayListより値を取得する。 取得した値を出力する。 結果 何回入力しますか? 3 1個目の値を入力してください。 hoge 2個目の値を入力してください。 poyo 3個目の値を入力してください。 hoo hoge poyo hoo 自分で書いたプログラム 1 import java.util.ArrayList; 2 import java.io.*; 3 4 class ArrayList2{ 5 public static void main(String[] args) throws IOException{ 6 7 ArrayList list = new ArrayList(); 8 list.add(n); 9 10 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 11 12 System.out.println("何回入力しますか?"); 13 14 String str = br.readLine(); 15 16 int num = Integer.parseInt(str); 17 18 for(int i = n ; i < num; i++){ 19 System.out.println("n個目の値を入力してください。"); 20 21 String str1 = br.readLine(); 22 23 } 24 } 25 } どうもうまくいきませんので教えて下さい。

  • ArrayListを使ったJavaコンパイルがうまくいかない

    題名どおりなのですが、まず以下のようなソースを 書きました。 import java.util.*; class Rab{ private String name; private int number; public Rab(){ name= ""; number=0; } public void setName(String name){ this.name=name; } public void setNumber(int number){ this.number=number; } public String getName(){ return name; } public int getNumber(){ return number; } } public class Rabexc{ public static void main(String[] args){ Rab[] rab=new Rab[5]; for(int i=0; i<5; i++){ rab[i]=new Rab(); } rab[0].setName("Owner"); rab[1].setName("Adminstrator"); rab[0].setNumber(1); rab[1].setNumber(2); ArrayList al=new ArrayList(); al.add(rab[0]); al.add(rab[1]); for(int i=0; i<al.size(); i++){ rab[i]=(Rab)al.get(i); System.out.println("name: "+rab[i].getName()+"number: "+rab[i].getNumber()); } } } これを実行してみたところ、 Rabexc.java:41: 警告:[unchecked] raw 型 java.util.ArrayList のメンバとしての add (E) への無検査呼び出しです。 al.add(rab[0]); ^ Rabexc.java:42: 警告:[unchecked] raw 型 java.util.ArrayList のメンバとしての add (E) への無検査呼び出しです。 al.add(rab[1]); ^ 警告 2 個 という警告が出てコンパイルできません。 サイト・参考書なども調べて考えていたのですが、いまいち問題の解決法が浮かばないため、詳しい方いましたら教えていただけると幸いです。 宜しくお願い致します。

  • ArrayListを使ったクラスの作成の仕方

    次のプログラム、どこが間違っているのでしょうか? コンパイルは通るのですが、実行しようとすると ずら~っとエラーが出てしまいます。 (例)at java.lang.ClassLoader.defineClass1(Native Method) at java.security.SecureClassLader.defineClass..... at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) ********************************************************** package siryou; import java.util.ArrayList; import java.io.*; class Info { private String name; private String age; private String nationality; public void setName(String nm) { name = nm; } public void setAge(String a) { age = a; } public void setNationality(String nt) { nationality = nt; } public void show(String j) { System.out.println("「名前=" + name + "」"); System.out.println("「年齢=" + age + "」"); System.out.println("「国籍=" + nationality + "」"); } } class Kojinjyoho02 { public static void main(String args[])throws IOException { System.out.println("何回入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); Info in = new Info(); ArrayList list = new ArrayList(); for(int i =0; i < res; i++){ System.out.println("名前は?"); str = br.readLine(); in.setName(str); System.out.println("年齢は?"); str = br.readLine(); in.setAge(str); System.out.println("国籍は?"); str = br.readLine(); in.setNationality(str); list.add(in); } for(int j=0; j < list.size(); j++){ String jyoho = (String)list.get(j); in.show(jyoho); } } }

    • ベストアンサー
    • Java
  • C# スタックに格納する要素が配列について

    スタックに格納する要素が配列の場合 // スタック生成 Stack<int[]> StackObj = new Stack<int[]>(); // 格納する配列データーの作成 int[] ArrayWork = new int[2]; ArrayWork[0] = 7; ArrayWork[1] = 12; // スタックに格納 StackObj.Push(ArrayWork); のように記述できます 同様に、POP、PEEP、COUNTの場合、どのように記述すればいいでしょうか?

  • スタックについて

    スタックを実現するプログラムを作っているのですが、実行するとセグメテーション違反が表示されます。でもどこが間違っているのかわかりません!どうしたらいいのでしょう? #include<stdio.h> #include<stdlib.h> struct stack{ int max; int used; int *array; }; struct stack * stack_create(int n) { struct stack *s; int i; s->array=(int *)malloc(sizeof(int)*n); s->used=0; s->max=n; return 0; } void stack_free(struct stack *s) { free(s); } int stack_push(struct stack *s,int datum) { if(s->used>=s->max){ return 0; } s->array[s->used]=datum; s->used++; return 1; } int stack_pop(struct stack *s,int *datump) { if(s->used<=0){ return 0; } *datump=s->array[s->used-1]; s->used--; return 1; } int stack_is_empty(const struct stack *s) { return s->used==0; } int main() { struct stack s; int i,p; int n; scanf("%d",&n); stack_create(n); for(i=0;i<=5;i++){ stack_push(&s,i); printf("push%2d\n",i); } for(i=1;i<=3;i++){ stack_pop(&s,&p); printf("pop%2d\n",p); } }

  • 文が指定されていませんエラーについて

    public class Stack2 { private static int[] stack = new int[50]; private static int ip = -1; //スタックポインター, -1ならデーターなし public static int push ( int inData ) { // データー格納 if (ip == (stack.length - 1)) { System.out.println(\"スタックがいっぱいです\"); } else { stack[++ip] = inData; } } public static int pop ( ) { // データー取り出し if ( ip < 0 ) { System.out.println (\"スタックにデーターがありません\"); return -2147483648; } else { return stack[ip]; } } } 「Stack2.java:10:return 文が指定されていません」コンバイルエラーになります。 どのようにデバックすれば良いのか教えてください。

  • コレクションクラスについて

    ●下記のコードについて質問があります import java.util.*; public class Test { public static void main(String args[]) { ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); list.add(new ObjectOne()); list.add(new ObjectOne()); list.add(new ObjectOne()); Collections.sort(list); } } class ObjectOne { private int x = 0; private int y = 0; } このソースをコンパイルすると、 シンボル: メソッド sort(java.util.ArrayList<ObjectOne>) 場所 : java.util.Collections の クラス Collections.sort(list); と、エラーが表示されてしまいます。 java.util.*をインポートしているので、上記のようなエラーはでないと 思うのですが、うまくいかないです。おそらく、ObjectOneクラスで 何か処理漏れが起きているのかもしれませんが、エラーとなる原因を 特定することができません。 エラーとなる原因と解消する手立てを教えていただければと思っております。 宜しくお願い致します。 「追記」 ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); の<ObjectOne>を消せばエラーはなくなりますが、 <ObjectOne>を消さない方針で考えがあればと思っております。

専門家に質問してみよう