ошибка в java .util.Stack.peek / pop (неизвестный источник) с if else - PullRequest
0 голосов
/ 19 июня 2020

У меня есть задача сделать калькулятор стека, и вот что у меня есть:

    public static void main(String[]args) {
    ArrayList<String> commands = new ArrayList<String>();
    commands.add("1");
    commands.add("2");
    commands.add("3");
    commands.add("4");
    commands.add("+");
    commands.add("+");
    commands.add("+");
    commands.add("2");
    commands.add("*");
    commands.add("=");
    System.out.println(commands); //prints the list
    System.out.println(computeResult(commands));
    commands.clear();
    commands.add("2");
    commands.add("4");
    commands.add("/");
    commands.add("=");
    System.out.println(commands); //prints the list
    System.out.println(computeResult(commands)); // gives 2
    commands.clear();
    commands.add("3");
    commands.add("4");
    commands.add("-");
    commands.add("=");
    System.out.println(commands); //prints the list
    System.out.println(computeResult(commands)); // gives 1
    }

public static int computeResult(ArrayList<String> commands) {
    Stack<Integer> dataStack = new Stack<Integer>();
    Iterator<String> commandsIterator = commands.iterator();
    while(commandsIterator.hasNext()) {

        /* sums up the two top elements from the stack and pushes the solution back on the stack
         * @param int A, int B, int C
         * @return
         */

        if(commands.contains("+")) {
            int A = dataStack.pop();
            int B = dataStack.pop();
            int C = A + B;
            dataStack.push(C);
        }

        /* subtract the two top elements from the stack and pushes the solution back on the stack
         * @param int A, int B, int C
         * @return
         */

        else if(commands.contains("-")) {
            int A = dataStack.pop();
            int B = dataStack.pop();
            int C = B - A;
            dataStack.push(C);
        }

        /* multiplies the two top elements from the stack and pushes the solution back on the stack
         * @param int A, int B, int C
         * @return
         */

        else if(commands.contains("*")) {
            int A = dataStack.pop();
            int B = dataStack.pop();
            int C = A * B;
            dataStack.push(C);  
        }

        /* divides the two top elements of the stack and pushes the solution back on the stack
         * @param int A, int B, int C
         * @return
         */

        else if(commands.contains("/")) {
            int A = dataStack.pop();
            int B = dataStack.pop();
            int C = B / A;
            dataStack.push(C);
        }

        /* pops the top element
         * @return popped element
         */

        else if(commands.contains("=")) {
            return dataStack.peek();
        }

        /* if the command is a number it will be assigned to an integer and pushed on the stack
         * @param int i, String command
         * @return
         */

        else {
            String command = commandsIterator.next();
            int i = Integer.parseInt(command);
            dataStack.push(i);
        }
     }
    return 0;
  }

Но проблема в том, что на выходе я получаю указанную выше ошибку. В этой программе я использовал if else, чтобы проверить, является ли мой ввод оператором или числом, и если это число, то я получаю sh число, если это оператор, я вставляю два верхних элемента и выполняю расчет. Результат снова выдвинут, поэтому я подумал, что это не должно быть проблемой. Я знаю, что означает эта ошибка, поэтому у меня вопрос, как ее решить в данном конкретном случае.

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Я думаю, вы здесь ошибаетесь

commands.contains ("+")

Я думаю, ваш итератор идеи для всех элементов computeResult чтобы проверить, является ли этот элемент оператором или числом, верно? Но если вы вызываете функцию commands.contains("+"), это всегда будет возвращать true, если ваш commands содержит + символ, независимо от того, в какой позиции +.

Итак, моя маленькая фиксированная

while (commandsIterator.hasNext()) {

    String s = commandsIterator.next();
    /* sums up the two top elements from the stack and pushes the solution back on the stack
     * @param int A, int B, int C
     * @return
         */
        if (s.equals("+")) {

        ...
        else if (s.equals("-"))
        ...

        else {
            int i = Integer.parseInt(s);
            dataStack.push(i);
        }
}

Я пробовал. Работайте как чемпион :) Надеюсь, что это поможет :)

0 голосов
/ 19 июня 2020

Вы получите сообщение об ошибке, потому что ваша реализация computeResult проверяет, содержит ли «список команд» эти строки. И поскольку весь список действительно содержит его, вы пытаетесь удалить из стека элементы, которых не существует.

Короче говоря, первое предложение if уже будет выполнено и вызовет ошибку.

Попробуйте отладить ваш метод computeResult.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...