0

我试图从用户那里获取一个表达式并对其进行评估,但我不断收到导致 arrayindexoutofboundsexceptions 和空指针异常的 pop 方法错误。我该如何解决这个问题,是否存在我遗漏的其他问题?谢谢

这是我的堆栈类

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();

}

} 
4

1 回答 1

0

您需要向 MyStack 类添加验证以避免错误流。例如,如果 Stack 已满,请不要尝试将项目添加到 Stack inside push() 方法。此外,在执行 pop 或 peek() 操作之前,您必须检查 Stack 是否为空。看看下面的 pop() 操作中的验证。

public E pop() {

    if(isEmpty()){
        // Handle the empty stack here (i.e : throw EmptyStackException)
    }
    top--;
    return data[top + 1];
}
于 2018-10-09T00:45:06.803 回答