スタック計算機を再構築しているので、再帰的です。ただし、エラーが発生します。
stacks2.java:29: illegal start of expression
public calculate(Stack<String> stack) {
^
stacks2.java:29: ';' expected
public calculate(Stack<String> stack) {
スタックをメソッドに正しく渡すためにどのようにサポートされていますか。
import java.util.*;
public class stacks2 {
public static void main (String []args){
System.out.printf("Enter a math equation in reverse polish notation:\n");
//Create stack of Strings
Stack<String> rpnStack = new Stack<String>();
//Create Scanner
Scanner input = new Scanner(System.in);
//String in = input.next();
while(input != null) {
String in = input.next();
// Tokenize string based on spaces.
StringTokenizer st = new StringTokenizer(in, " ", false);
while (st.hasMoreTokens()) {
rpnStack.push(st.nextToken());
}
//Send stack to Calculation Method
calculate(rpnStack);
}
}
public static void calculate(Stack<String> stack) {
// Base case: stack is empty => Error, or finished
if (!stack.isEmpty())
// throw new StackUnderflowException("Empty Stack");
// Base case: stack has 1 element, which is the answer => finished
if (stack.size(1))
System.out.printf("Finished, Answer: %f\n",stack.peek());
// Recursive case: stack more elements on it.
if (stack.size() > 1){
String temp1 = stack.peek();
stack.pop();
String temp2 = stack.peek();
stack.pop();
String temp3 = stack.peek();
stack.pop();
if (temp3.equals("+")){
float resultant = Float.parseFloat(temp1) + Float.parseFloat(temp2);
stack.push(String.valueOf(resultant));
//System.out.println(resultant);
calculate(stack);
}
if (temp3.equals("-")){
float resultant = Float.parseFloat(temp1) - Float.parseFloat(temp2);
stack.push(String.valueOf(resultant));
//System.out.println(resultant);
calculate(stack);
}
else if (temp3.equals("*")){
float resultant = Float.parseFloat(temp1) * Float.parseFloat(temp2);
stack.push(String.valueOf(resultant));
//System.out.println(resultant);
calculate(stack);
}
else if (temp3.equals("/")){
float resultant = Float.parseFloat(temp1) / Float.parseFloat(temp2);
stack.push(String.valueOf(resultant));
//System.out.println(resultant);
calculate(stack);
}
else{
System.out.printf("Something severely has gone wrong.");
}
}
}
}
コードの簡単な説明:スタックを作成し、文字列トークナイザーを介してユーザー入力で埋めます。次に、それを計算メソッドに貼り付けます。ユーザーにRPNの式を繰り返し要求し、式が有効な場合は結果を計算し、そうでない場合はエラーを通知する必要があります。これを行うには、計算する必要があると思います。RPNの形式が正しくない場合は、計算中に停止します。私は最初の3つのストリングを上にします。一時3は常に演算子である必要があります。そうでない場合、RPNは正しくフォーマットされていません。コードが空の場合、プログラムはアンダーフロー例外をスローします。要素が1つある場合は、それを返して答えます。私のifステートメントは正しいと思います。そうですね、それが機能するかどうかを確認したいのですが、スタックを渡すことは、今のところ私を少し妨げています。