1

私は今スタックを学んでいます。私のコードはコンパイルされています。実行すると、コードはデバッグの println とエラーを出力しません

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.Vector.ensureCapacityHelper(Vector.java:226)
at java.util.Vector.addElement(Vector.java:573)
at java.util.Stack.push(Stack.java:50)
at stacks.main(stacks.java:56)

表示されています。

私のコードは次のようになります:

import ch03.stacks.*;

import java.util.*;

public class stacks {

public static void main (String []args){

    System.out.printf("Enter a math equation in reverse polish notation:\n");

    Stack<Double> pemdas = new Stack<Double>();

    Scanner input = new Scanner(System.in);
    String in = input.next();

    double temp1, temp2, resultant = 0;


    while(input.hasNext()){
        if(in == "+"){
        temp1 = pemdas.peek();  
        pemdas.pop();
        temp2 = pemdas.peek();
        pemdas.pop();
        resultant = temp1 + temp2;
        pemdas.push(resultant);
        System.out.println(resultant);
        }

        if(in == "-"){
        temp1 = pemdas.peek();  
        pemdas.pop();
        temp2 = pemdas.peek();
        pemdas.pop();
        resultant = temp1 - temp2;
        pemdas.push(resultant);
        System.out.println(resultant);
        }

        if(in == "*"){
        temp1 = pemdas.peek();  
        pemdas.pop();
        temp2 = pemdas.peek();
        pemdas.pop();
        resultant = temp1 * temp2;
        pemdas.push(resultant);
        System.out.println(resultant);
        }

        if(in == "/"){
        temp1 = pemdas.peek();  
        pemdas.pop();
        temp2 = pemdas.peek();
        pemdas.pop();
        resultant = temp1 / temp2;  
        pemdas.push(resultant);
        System.out.println(resultant);
        }

        else
        pemdas.push(Double.parseDouble(in));
        System.out.println(resultant);

        }



    System.out.println("Answer:"+ resultant);
    }
}

したがって、最初に逆ポーランド記法で整数の文字列を読み取り、それがオペランドでない場合はスタックにポップします。少なくとも私はそれがやっていると思います。どんな助けでも大歓迎です。

4

2 に答える 2

3

あなたが使用しpeek()ているのは、実際には入力から次の文字を削除しないため、何度もループします。あなたが必要nextInt()です;

于 2012-10-25T00:29:07.323 に答える
1

Scanner hasNext/next を正しく使用していません。それぞれnext()の前に必ずhasNext().

next()コードでは、while ループの前で呼び出しています。次に、の戻り値を使用しhasNext()て while ループを終了します。しかし... while ループ内で「next()」を呼び出すことは決してありません。したがってhasNext()、常に true を返し、無限ループに陥ります。これは、前述のピークの問題と相まって、メモリが不足するまでスタックを増やしている可能性があります。

修正は簡単です。while ループ内でnext()直後に移動hasNext()

Scanner input = new Scanner(System.in);
double temp1, temp2, resultant = 0;

while(input.hasNext()) {
    String in = input.next();

残念ながら、文字列の比較が正しく行われていないため、プログラムはまだ機能しません。次のような行を置き換えます。

if (in == "+")

if (in.equals("+"))

うまくいけば、これは単なるタイプミスでした。文字列の比較に == を使用することが問題になる理由がわからない場合は、Java の等価性を確認する必要があります。

最後に、if ロジックに問題があります。ヒント: 相互に排他的なケースを処理するには、次のようなコードを使用します。

if () 
{
}
else if ()
{
}
else if ()
{
}
else
{
}
于 2012-10-25T00:57:30.140 に答える