3

当我只在一行中输入 1 或 2 个整数时,我的程序可以正常工作,例如:+ 13 24 或 * 4 - 165 235。但如果我输入 % * 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

1

您使用的算法是错误的!

例如,假设您给出:

% * 5 12 8

您的程序将5作为答案输出

它会将 % 和 * 压入堆栈,并将 5 12 和 8 压入堆栈

然后它会取出 8 和 12 并取出 * 并做8 * 12 = 96并将其压入堆栈

现在在下一轮中,它将取出 96 和 5 和 % 作为运算符,并5 % 96 = 5作为输出给出

在这里你需要考虑两件非常重要的事情:

  1. % 运算符与 * 和 / (在 Java 中)具有相同的优先级。但是前缀表达式不会以您的程序正在执行的方式进行评估:

    % * 5 12 8应评估为:

    (5 * 12) % 8这是4

    所以更新你的算法。

  2. 您的算法不考虑运算符优先级。在您的程序中添加该功能!

    在此处尝试一些示例

希望这可以帮助!

于 2014-01-30T18:22:33.817 回答
0

“操作的顺序是在前缀符号的结构中定义的,可以很容易地确定。要记住的一点是,在执行操作时,操作由第二个操作数应用于第一个操作数。这不是问题可交换的运算,但对于除法或减法等非交换运算,这一事实对于语句的分析至关重要。例如,以下语句:

/ 10 5

读作“10除以5”。因此,解决方案是 2,而不是 1/2,因为这是不正确分析的结果。

由于您没有发布错误的结果,我假设这是您的问题

于 2014-01-30T18:20:14.643 回答