Почему моя программа операций с префиксами не работает, когда я ввожу более 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();
    }
}

}

2 ответа

Используемый вами алгоритм неверен!

Например, предположим, вы даете:

% * 5 12 8

ваша программа выведет 5 как ответ

Это будет толкать% и * в стеке и 5 12 и 8 в стеке

Тогда он вынимает 8 и 12 и вынимает * и делает 8 * 12 = 96 и положить его на стек

Теперь в следующем раунде он возьмет 96 и 5 и% как оператор и сделает 5 % 96 = 5 который дается в качестве выхода

Здесь нужно учесть 2 очень важные вещи:

  1. Оператор% имеет тот же приоритет, что и * и / (в Java). Но выражение префикса оценивается не так, как ваша программа:

    % * 5 12 8 следует оценивать как:

    (5 * 12) % 8 который 4,

    Так что обнови свой алгоритм.

  2. Ваш алгоритм не учитывает приоритет оператора. Добавьте эту функцию в вашу программу!

    Попробуйте несколько примеров здесь

Надеюсь это поможет!

"Порядок операций определяется в структуре префиксной нотации и может быть легко определен. Следует иметь в виду, что при выполнении операции операция применяется к первому операнду вторым операндом. Это не проблема с операции, которые коммутируют, но для некоммутативных операций, таких как деление или вычитание, этот факт имеет решающее значение для анализа оператора. Например, следующий оператор:

/ 10 5

читается как "делим 10 на 5". Таким образом, решение равно 2, а не 1/2, что может быть результатом неправильного анализа.

Так как вы не опубликовали неправильные результаты, я предполагаю, что это ваша проблема

Другие вопросы по тегам