• 締切済み

java

大学で、javaをやっているのですが、わからないので、教えてください。内容は以下のことです。 LinkedListを使用して、Stack Calculatorを作成する。以下のように出力させる。 Commands: push n, add, sub, mult, div, clear, or quit. ? push 4 4.0 ? push 3 3.0 4.0 ? push 2 4.0 3.0 2.0 ? mult 6.0 4.0 ? add 10.0 ? clear empty ? quit Thanks for using the Stack Calculator. ちなみにStackCalculatorクラスは、以下のメソッドを持つ void push(double x) double x pop() double add() double subtract() double multiply() double divide() void clear() double[] getValues() int size() getValuesメソッドは、LinkedListのtoArrayメソッドを使用する。

みんなの回答

  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.1

まずは「スタック」というデータ構造について調べて、理解してみましょう。 また、課題に取り組む前に、サンプルプログラムを真似て実行させたり、 サンプルプログラムを書き換えて実行させる等して、 LinkedListの使い方を理解して下さい。 それらができれば、この課題を解けるようになると思います。 LinkedListにどのような機能があるか分からない場合、 次のサイトを見て調べてみましょう。 http://java.sun.com/javase/ja/6/docs/ja/api/java/util/LinkedList.html > ちなみにStackCalculatorクラスは、以下のメソッドを持つ > void push(double x) > double x pop() > double add() > double subtract() > double multiply() > double divide() > void clear() > double[] getValues() > int size() LinkedListには元からpushメソッドとpopメソッドがあるので、 それらを使えば > void push(double x) > double x pop() の2つは完成します(多分)。 継承してしまえば、わざわざ作る必要もないですが…。 add, substract, multiply, divideに関しては、 まず「逆ポーランド記法」について調べてみると良いと思います。 ウィキペディアの「逆ポーランド記法」のページは特にヒントになると思います。 clearメソッドに関しては、 LinkedListのremoveメソッドあたりを利用すると良いと思います。 getValuesメソッドに関しては > getValuesメソッドは、LinkedListのtoArrayメソッドを使用する。 の通りにやれば良いと思います。 sizeメソッドに関しては、LinkedListのsizeメソッドを使えば良いと思います (こちらも継承してしまえば、作る必要はないです)。 課題で作る各メソッドが何をするものなのか全く書かれていないので、 あっているかは分かりませんが…。

noname#150568
質問者

お礼

ありがとうございました。各メソッドの機能はそれであってます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アセンブリ言語のプログラム方法がわかりません!!

    アセンブリ言語の問題です。 スタックを使って、接尾辞(Postfix)で数式を計算するプログラムを作ってください。 足し算(add)、引き算(subtract)、掛け算(multiply)は二進化十進表現で計算します。 足し算は'+', 引き算は'-', 掛け算は'*',そして終了を'$'で表します。 計算は8-bitの2の補数をつかって行います。 例えば、 expression: .db 3,9,4,6,'+','-',2,'-','+','$' push 3,9,4,6 (stack: 6 4 9 3) pop 6 and 4, add, push 10 (stack: 10 9 3) pop 10 and 9, subtract, push -1 (stack: -1 3) push 2 (stack: 2 -1 3) pop 2 and -1, subtract, push -3 (stack: -3 3) pop -3 and 3, add, push 0 (stack: 0) pop the 0 into register r0 and stop. というような計算を実行するプログラムを作ってください。 よろしくお願いします。 できればAVR studioを使ってプログラミングしてほしいです。

  • このプログラムが実行できません。

    スタックの動きを再現するプログラムを作ったのですが、エラーがでます。プログラムは以下に示します。 メインクラス 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
  • クラス→スタックを使う

    初歩的なとこですがすでに着いていけず困っています。 問題は、  下記のプログラムにおいて、スタックへ整数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
  • C言語で変更していただきたい所があるのですが・・・

    下のソースを加減乗除だけでなく、余りを求める演算(%)やべき乗演算(^)も使えるようにしたいのですがうまくいきません。 どなたか変更例をお見せできますでしょうか? #include <stdio.h> #include <stdlib.h> #define STACK_MAX 10 /* 配列によるスタック構造 */ double stack[STACK_MAX]; /* スタック頂上の位置(最下部からのオフセット)*/ int stack_top = 0; /* スタックへのpush */ void stack_push(double val) { if(stack_top == STACK_MAX) { /* スタックが満杯になっている */ printf("エラー:スタックが満杯です(Stack overflow)\n"); exit(EXIT_FAILURE); } else { /* 渡された値をスタックに積む */ stack[stack_top] = val; stack_top++; } } /* スタックからpop */ double stack_pop(void) { if(stack_top == 0) { /* スタックには何もない */ printf("エラー:スタックが空なのにpopが呼ばれました" "(Stack underflow)\n"); exit(EXIT_FAILURE); return 0; } else { /* いちばん上の値を返す */ stack_top--; return stack[stack_top]; } } int main(void) { char buffer[256]; double cal1, cal2; int i; do { printf("現在のスタック(%d個):", stack_top); for(i = 0; i < stack_top; i++) { printf("%0.3f ", stack[i]); } printf("\n>"); fgets(buffer, 255, stdin); switch(buffer[0]) { case '+': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 + cal1); break; case '-': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 - cal1); break; case '*': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 * cal1); break; case '/': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 / cal1); break; case '=': /* =の場合はこのすぐあとでwhile文からも抜ける */ break; default: /* 入力された値は数字のはずなので,スタックに積む */ stack_push(atoi(buffer)); break; } } while(buffer[0] != '='); printf("計算結果は%f です。\n",stack_pop()); if(stack_top != 0) { printf("エラー:スタックにまだ数が残っています\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }

  • Javaのプログラムの質問です。

    Javaのプログラムについての質問です。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。  注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中に番号を振ってあります。 import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; import java.util.List; class LocalList implements List{  private int Count;  private String Data[];  private Iterator ite;  private ListIterator lite;  // コンストラクタ  void mylist(){   Data = new String[10];   Count = 0;  }  (1)  public boolean add(Object str){   if(Count >= 10){    return false;   }   Data[Count ++] = new String((String)str);   return true;  }  public void add(int i,Object str){  }        public boolean addAll(Collection c){   return false;  }        public boolean addAll(int i,Collection c){   return false;  }    (2)  public void clear(){   Count = 0;  }  public boolean contains(Object str){   return false;  }          public boolean containsAll(Collection c){   return false;  }  public boolean equals(Object str){   return false;  }    (3)  public Object get(int i){   return (i >= Count);  }  public int hashCode(){   return -1;  }  public int indexOf(Object str){   return -1;  }  public boolean isEmpty(){   return false;  }  public Iterator iterator(){   return ite;  }     public int lastIndexOf(Object str){   return -1;  }     public ListIterator listIterator(){   return lite;  }     public ListIterator listIterator(int i){   return lite;  }    (4)  public Object remove(int i){   return (i >= Count);  }    public boolean remove(Object str){   return true;  }         public boolean removeAll(Collection c){   return false;  }         public boolean retainAll(Collection c){   return false;  }    (5)  public Object set(int i,Object str){   return Data[i];  }    (6)  public int size(){   return Count;  }  public List subList(int i,int j){   return this;  }  public Object[] toArray(){   return Data;  }  public Object[] toArray(Object[] a){   return Data;  } } class Main {  public static void main(String[] args) {   mylist sub = new mylist();   sub.add("ビルドバーニングガンダム");   sub.add("ライトニングガンダム");   sub.add("ウイニングガンダム");   sub.add("ガンダムフェニーチェリナーシタ");   sub.add("R・ギャギャ");   for(int i = 0; i < sub.size(); i++){      System.out.println(sub.get(i));   }   // 改行   System.out.println();   // setメソッド   sub.set(1,"ガンダムエピオン");   for(int i = 0; i < sub.size(); i++){    System.out.println(sub.get(i));   }   // 改行   System.out.println();   // sizeメソッド   System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n");   // removeメソッド   sub.remove(1);   for(int i = 0; i < sub.size(); i++){       System.out.println(sub.get(i));   }   // clearメソッド   sub.clear();   System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです");    } } setメソッドとremoveメソッド以外は起動するのようになったのですが、この2つがうんともすんとも動きません。ジェネリクス型を使うという考え方もあるらしいのですが、ネットで調べてもピンと来ず寸詰まり状態になってしまっています。後少しだと思うのですが。。。。 どなたかご教授頂けないでしょうか?よろしくお願い致します。

  • javaのプログラミングについての質問です。

    Javaのプログラムについての質問です。長くなってしまいますがご容赦下さい。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。以下が現在までに作成したコードになります。 注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中にコメントを振ってあります。 import java.util.List; import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; class Mylist implements List{   private int Count;   private String Data[];   // コンストラクタ   public Mylist(){    Data = new String[10];    Count = 0;   } /** 実装するaddメソッド @return boolean APIの設定に従う @param e エレメント(要素) **/   public boolean add(E e){    Data[Count] = (String)e;   Count++;   return true;   }   public void add(int i,Object str){   }   public boolean addAll(Collection c){     return false;   }   public boolean addAll(int i,Collection c){     return false;   } /** 実装するclearメソッド **/   public void clear(){     Count = 0;   }   public boolean contains(Object str){     return false;   }   public boolean containsAll(Collection c){     return false;   }   public boolean equals(Object str){     return false;   } /** 実装するgetメソッド @return E エレメント(要素) @param i 指定されたインデックス番号 **/   public E get(int i){      /*     エレメントeに、String型Data[i]を     キャストして格納*/     E e = (E)Data[i];     return e;   }   public int hashCode(){     return -1;   }   public int indexOf(Object str){     return -1;   }   public boolean isEmpty(){     return false;   }   public Iterator iterator(){     return null;   }   public int lastIndexOf(Object str){     return -1;   }   public ListIterator listIterator(){     return null;   }   public ListIterator listIterator(int i){     return null;   }    /**   * 実装するremoveメソッド   * @return E エレメント(要素)   * @param index 指定されたインデックス番号   **/   public E remove(int index){ /* Dataを最大まで回し、iをインクリメントしたData[i++]を String型Dataに格納する*/ for(int i = index; i < Data.length; i++){ Data[i] = Data[index++]; } Count--; E e = (E)Data; return e; } public boolean remove(Object str){ return false; } public boolean removeAll(Collection c){ return false; } public boolean retainAll(Collection c){ return false; } /** * 実装するsetメソッド * @return E エレメント(要素) * @param i 指定されたインデックス番号 * @param element 置き換える要素 **/ public E set(int i,E element){ // String型Dataにelementをキャストして格納 Data[i] = (String)element; // エレメントeにData[i]をキャストして格納 E e = (E)Data[i]; // 値を返す return e; } /** * 実装するsizeメソッド * @return int 指定されたインデックス番号 **/ public int size(){ return Count; } public List subList(int i,int j){ return this; } public Object[] toArray(){ return Data; } public Object[] toArray(Object[] a){ return Data; } } class Main { /** メインメソッド **/ public static void main(String args[]) { Mylist sub = new Mylist(); /* addメソッドを実装し、機体名を要素とする。 addを最大まで回し、getメソッドで要素を取り出して表示する*/ sub.add("ビルドバーニングガンダム"); sub.add("ライトニングガンダム"); sub.add("ウイニングガンダム"); sub.add("ガンダムフェニーチェリナーシタ"); sub.add("R・ギャギャ"); sub.add("ユニコーンガンダム"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // sizeメソッド System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n"); // setメソッド sub.set(0,"ガンダムエピオン"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // 改行 System.out.println(); // removeメソッド sub.remove(1); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // clearメソッド sub.clear(); System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです"); } } コンパイルして実行すると、removeメソッドで指定した箇所ではなく、要素の1番最後が削除されています。思うに、removeメソッドを実装する所のfor(int i = index; i < Data.length; i++){の中の条件が違うと思うのですが。。。。 また、現在addには10個箱を作成するようにしていますが、11個目をメインクラス内で用意した場合、例外ではなく新たに箱を作らなければならない、という後だしジャンケン的な事を言われて、思わず「じゃあArrayListでいいじゃないか」と思ってしまいました。 気を取り直してこの3連休で終わらせたいと思っています。ここまでで現状コードの完成は50%かそれ以下だとは思いますが、どなたか上記2点について御教授頂けないでしょうか。よろしくお願い致します。

  • これで最後、スタックの問題です…

    これでやっと最後です。 一つのスタックに積んである5つの数字を二つのスタックを用いて逆さにする問題です。 Suppose that you have a stack "S". Using the usual stack operations (given in figure 4.7 on page 138), -explain how you can reverse the order of elements on stack "S" using only two additional stacks. -write a void method called "reverse" the order of elements on stack "s". The method creates two new stacks and will use only the stack operations given in figure 4.7. Figure 4.7(これらの命令しか使ってはいけません) boolean empty() Object peek() Object pop() Object push(el) int search(el) Stack() public void reverse (Stack s) { Stack s1, s2; s1 = new Stack(); s2 = new Stack(); //ブランク 25 5 30 20 10 - S ←スタック(実行前) 10 20 30 5 25 - S ←スタック(実行後) 私自作のメソッド public void reverse (Stack s) { Stack s1, s2; s1 = new Stack(); s2 = new Stack(); while(!S.empty()) { S1.push(S.pop()); } while(!S1.empty()) { s2.push(S1.pop()); } while(!S2.empty()) { S.push(S2.pop()); } } アルゴリズムは分かっている(つもりな)んですが 本当にこれで動くのか分かりません。 mainも含めたプログラムは教科書に載っていません。 pushとpopの図はたくさんあるのですが、肝心のプログラムが載っていません。 上のであっていますでしょうか? スタックの神様、どうかお助け下さい。m(__)m

  • javaの問題の動かし方?

    平成17年春期  基本情報技術者試験午後問題の 問12 JAVA電卓プログラムの プログラム4を 実際にコーディングしたのですが コンパイルできません。 (全部で4つのプログラムから構成されていて、 プログラム1、2、3はコンパイル及び実行できました) 肝心のメインメソッドである最後のプログラム4がコンパイルできず 実際の検証が出来ないので困っています。 (エラー内容) CalculatorTest.java:30: シンボルを見つけられません。 シンボル: メソッド eventDispatched(CalculatorEvent) 場所 : Calculator の クラス calc.eventDispatched(event); (プログラム内容) //プログラム4 public class CalculatorTest{ public static void main(String[] args){ Calculator calc = new Calculator( new CalculatorOutput(){ public void display(int value){ System.out.println(value); } public void display(String value){ System.out.println(value); } }); String keys = args[0]; for (int i=0; i<keys.length(); i++){ char c = keys.charAt(i); CalculatorEvent event = null; if (c>= '0' && c<= '9'){ event = new CalculatorEvent( CalculatorEvent.DIGIT,c - '0'); }else if (c == '=' || c == '+' || c == '-' || c == '*' || c == '/'){ event = new CalculatorEvent( CalculatorEvent.OPERATOR, c); }else if (c == 'C'){ event = new CalculatorEvent( CalculatorEvent.CLEAR); } if(event != null) calc.eventDispatched(event); } } } 尚、eventDispatchedは、プログラム3で出てきました。 プログラム1、2、3、4は ソースファイル、クラスファイル共に同じ フォルダにあります。 プログラム4の 何処をどの様に変更したら コンパイル及び実行できるようになるでしょうか? 詳しい方教えて下さい。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • プログラミング(JAVA)

    1.つぎのような貯水槽の機能を表現するクラスがあるとします。以下の記述に引数で指定した量だけ水を加えるメソッドaddを付加し、その機能を確認できるようmainメソッドを変更し実行させなさい。ただし、水は最大貯水量を超えては入れられないようにしなさい。最大量に達した場合は、警告メッセージを表示するようにしなさい。 ↓↓自分でやったコードですここまでできました///次がわかりません class WaterTank6_1 { double capacity = 100.0; // 最大貯水量(初期値が100リットル) double meter = 0.0; // 水量計の値 void show() { System.out.println(“現在の貯水量は “ + meter + “リットルです。”); } public static void main(String[] args) { WaterTank6_1 tank1 = new WaterTank6_1(); tank1.show(); } } addの仕様 void add(double val)

  • Javaのプログラムについての質問です。

    Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。 注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。 以下は極最初期のソースになります。 import java.util.List;  public interface Interface{   int size();   boolean add();   boolean remove();   void clear();   get();   set();  } public class LocalList implements Interface{ class Main implements LocalList {  public static void main(String[] args) {     } } Listインターフェースについてネットで調べてはいるのですが、具体的な解決方法が見えてきません。 どなたか参考ソースや考え方などを教えていただけないでしょうか。よろしくお願い致します。

このQ&Aのポイント
  • 抑うつ状態から元気になるまでの時間や復職のタイミングについて知りたいです。
  • 抑うつ状態からの回復には、個人差がありますが、一般的には数ヶ月から半年程度かかることが多いです。
  • 復職のタイミングは、自身の状態や医師の判断によって異なりますが、十分な回復が見込めるまでは休職を継続することが望ましいです。
回答を見る