Почему моя программа оценки префиксных выражений неправильно рассчитывает любое сложение или вычитание? - PullRequest
0 голосов
/ 09 мая 2020

У меня есть программа, которая должна принимать Очередь , содержащую элементы префиксной операции (т.е. операции, в которой указано «+ 4 2» вместо «4 + 2», что является инфиксным) , затем выведите целочисленный ответ (предположим, что двойное значение никогда не понадобится, хорошо?). Он работает правильно для любых операций умножения или деления, но не работает при любых операциях сложения или вычитания, и, что еще хуже, непоследовательным образом. Например, вывод для «- 5 1» равен 5, что предполагает добавление одного дополнительного целого числа, но вывод для «- 5 2» равен 2, что на одно целое меньше. Я просто не понимаю, где находится лог c этой ошибки?

 public static int eval(Queue<String> s){
        String a=s.toString();
        String b= a.replaceAll("\\[","").replaceAll("\\]","").replace(", "," ");
        StringBuilder c=new StringBuilder();
        c.append(b);
        c.reverse();
        Stack<Integer> stack=new Stack<>();
        for (int i=0; i<c.length();i++){
            char current=c.charAt(i);
            if (current==' ')
                continue;
            if (current=='*'||current=='/'||current=='+'||current=='-'){
                Integer one = stack.pop();
                Integer two = stack.pop();
                Integer maybe;
                switch (current){
                    case '+':
                        maybe=one+two;
                    case '-':
                        maybe=one-two;
                    case '*':
                        maybe=one*two;
                    case '/':
                        maybe=one/two;
                        break;
                    default:
                       maybe=one;
                }
            stack.push(maybe);
            } else {
                StringBuilder maybe=new StringBuilder();
                while(Character.isDigit(current)){
                    maybe.append(current);
                    i++;
                    current=c.charAt(i);
                }
                i--;
                Integer n=Integer.parseInt(maybe.reverse().toString());
                stack.push(n);
            }
        }
        return stack.pop();
        }
    }

Изменить: Примечание: он также может выводить только два простых целых числа, один оператор, уравнения, но я могу понять, как измените это.

...