3

+ 13 24 または * 4 - 165 235 のように 1 つまたは 2 つの整数を続けて入力すると、プログラムは正しく動作します。しかし、% * 5 12 8 を入力すると、正しい答えが得られません。行に長い整数の文字列がある場合に機能するように、ループを変更するにはどうすればよいですか。操作の順序とプレフィックス表記の形式を考えると? *私のスタック クラスとそのメソッドは正しく動作します。

    import java.util.*;
    public class part1Main {

public static void main(String[] args) {
    // Reference variables
    String temp2;
    int num, num1, num2, ch;
    char op;
    @SuppressWarnings("resource")
    Scanner keyboard = new Scanner(System.in);
    PrefixStack<Character> operands = new PrefixStack<Character>();
    PrefixStack<Integer> S = new PrefixStack<Integer>();

    System.out.print("Do you want to perform a prefix operation?");
    System.out.print(" 1 for yes or 0 to quit: ");
    ch = keyboard.nextInt();
    temp2 = keyboard.nextLine();

    while(ch != 0){
        System.out.print('\n'+ "Enter the operation with a space between "
                + "each character. End your operation with a period: ");

        while(keyboard.hasNext()){
            if (keyboard.hasNextInt()){
                num = keyboard.nextInt();
                S.push(num);}
            else{
                temp2 = keyboard.next();
                switch(temp2.charAt(0)){
                    case '+': operands.push('+');
                        break;
                    case '-': operands.push('-');
                        break;
                    case '/': operands.push('/');
                        break;
                    case '*': operands.push('*');
                        break;
                    case '%': operands.push('%');
                        break;
                }
            }
            if(temp2.charAt(0) == '.')
                break;
        }

        while(S.size > 1){
            op = operands.pop();
            num2 = S.pop();
            num1 = S.pop();
            switch(op){
                case '+': S.push(num1 + num2);;
                    break;
                case '-': S.push(num1 - num2);;
                    break;
                case '/': S.push(num1 / num2);;
                    break;
                case '*': S.push(num1 * num2);;
                    break;
                case '%': S.push(num1 % num2);
                    break;
            }
        }
        System.out.println("Your operation = " + S.pop());

        System.out.print('\n'+"Do you want to perform another operation?");
        System.out.print(" 1 for yes or 0 to quit: ");
        ch = keyboard.nextInt();
    }
}

}

4

2 に答える 2

0

「演算の順序は、接頭表記の構造内で定義され、簡単に決定できます。覚えておくべきことの 1 つは、演算を実行するときに、演算が第 2 オペランドによって第 1 オペランドに適用されることです。これは問題ではありません。ただし、除算や減算などの非可換演算の場合、この事実はステートメントの分析にとって重要です。たとえば、次のステートメントは次のとおりです。

/ 10 5

「10 を 5 で割る」と読みます。したがって、解は 2 であり、間違った分析の結果となる 1/2 ではありません。

あなたは間違った結果が何であるかを投稿していないので、これがあなたの問題だと思います

于 2014-01-30T18:20:14.643 に答える