Postfix Expression Evaluator, ошибки метода pop - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь взять выражение у пользователя и оценить его, но я продолжаю получать ошибки метода pop, которые приводят к массиву indexexboundofboundsexceptions и исключениям нулевого указателя.Как я могу это исправить, и есть ли проблема, которая лежит в другом месте, что мне не хватает?Спасибо

Вот мой класс стека

public class MyStack<E> {
private E[] data;
private int top;

public MyStack() {
    data = (E[]) (new Object[10]);
    top = -1;
}

public void push(E item) {
    top++;
    data[top] = item;
}

public E peek() {
    return data[top];
}

public E pop() {
    top--;
    return data[top + 1];
}

public boolean isEmpty() {
    return top < 0;
}
}

Вот класс оценщика

public class EvalPostfix {

private String post;

public EvalPostfix(String post) {
    this.post = post;
}

public int eval() {

    MyStack<Integer> stack = new MyStack<Integer>();
    Scanner tokens = new Scanner(post);
    int result = 0;

    while (tokens.hasNext()) {
        if (tokens.hasNextInt()) {
            stack.push(tokens.nextInt());
        } else {
            int right = stack.pop();
            int left = stack.pop();

            if (tokens.equals("+")) {
                result = left + right;
            } else if (tokens.equals("-")) {
                result = left - right;
            } else if (tokens.equals("*")) {
                result = left * right;
            } else if (tokens.equals("/")) {
                result = left / right;
            }
            stack.push(result);
        }
    }
    return stack.pop();
}
}

, а вот основной класс

public class Prog4 {

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    System.out.println("Enter postfix expression: ");
    String post = input.nextLine();

    EvalPostfix ev = new EvalPostfix(post);
    int result = ev.eval();

}

} 

1 Ответ

0 голосов
/ 09 октября 2018

Вам нужно будет добавить проверки в ваш класс MyStack, чтобы избежать потоков ошибок.Например, если стек уже заполнен, не пытайтесь добавить элемент в метод стека внутри push ().Кроме того, вам нужно проверить, пуст ли стек, прежде чем выполнять операции pop или peek ().Посмотрите на проверку внутри операции pop () ниже.

public E pop() {

    if(isEmpty()){
        // Handle the empty stack here (i.e : throw EmptyStackException)
    }
    top--;
    return data[top + 1];
}
...