0

スタック計算機を再構築しているので、再帰的です。ただし、エラーが発生します。

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ステートメントは正しいと思います。そうですね、それが機能するかどうかを確認したいのですが、スタックを渡すことは、今のところ私を少し妨げています。

4

2 に答える 2

3

あなたはあなたの方法にを与える必要がありreturn typeます。また、mainメソッドから直接呼び出すため、静的である必要があります。したがって、メソッド宣言を次のように変更します。-

public static void calculate(Stack<String> stack)

また、ループmainの後、メソッドの閉じ中括弧を見逃しました。whileあなたはそこに余分な中括弧を置く必要があります。

PS: -Javaのクラス名は常にCamelCase、すべての単語の最初の文字がである必要がありUpperCaseます。また、クラス名は常に。であってはなりsingularませんplurals

だから、本当に、またはさらに良いstacks2はずです、あなたはそれに名前を付けることができますStack2MyStack

使用したことがあります:-

Float.parseFloat(temp2);// Convert temp2 into a float

L値なし。Float.parseFloatプリミティブfloat値を返します。あなたはそれをどこかに保存する必要があります、さもなければそれは役に立たないです。

したがって、以下のコードを置き換える必要があります。-

Float.parseFloat(temp2);
Float.parseFloat(temp1);
float resultant = temp1 * temp2;

と: -

float resultant = Float.parseFloat(temp1) * Float.parseFloat(temp2);
于 2012-10-25T05:34:18.773 に答える
2

}main関数の終わりを置く必要があります。}whileループの終わりをそれと間違えます。

于 2012-10-25T05:34:13.627 に答える