Postfix Evaluator--扫描仪问题?

时间:2015-02-10 05:18:42

标签: java linked-list java.util.scanner infinite

我正在使用扫描仪进行后缀表达式评估,并遇到了一个小问题。当我通过命令行输入表达式时,表达式不会终止并达到无限循环。使用print语句和jdb,我能够推断出我希望的命令都能正常执行并正确评估,但是,我无法弄清楚为什么扫描器不会终止(因此,将它留在无限循环中)。我知道扫描仪必须吃输入而不仅仅是确保它已经离开了,它应该做(我相信)。当我输入我的扫描仪作为我想要评估的表达式而不是System.in(用于命令行输入)时,一切都按照需要终止,这就是为什么我很困惑。以前有人遇到过这个问题吗?我将在下面发布一些简洁的代码片段,取自未能终止的主片段。

Scanner i = new Scanner(System.in);
System.out.println("Message...");
StackList stack = new StackLinkedList();
while (i.hasNext()) {
    if (input.hasNextInt()) {
        stack.push(i.nextInt());
        continue;
    }
    String op = input.next());
    Integer val_one = stack.pop();
    Integer val_two = stack.pop();
    switch(op) { a switch statement that evaluates based on the operator};
}
input.close();
System.out.println(stack.pop);

注意:我已经检查过以前的实现,但我无法弄清楚我的不同之处。遇到这些类型问题的大多数人都不会随意输入,我相信我的代码应该这样做。我输入的表达式如1 2 +'Enter'(答案应为3,当我将扫描仪设置为字符串1 2 +时确实为3)但是当输入是通过命令行时它们没有终止。

1 个答案:

答案 0 :(得分:1)

从控制台读取的扫描仪总是会有更多数据,因为您可能会再输入更多数据。

您可以按 Ctrl-D Enter (在Linux上)或 Ctrl-Z Enter (在Windows上),它模拟"文件结尾"控制台上的条件(就像你正在从文件或字符串中读取并到达它的末尾)。

但是,您可能希望从控制台一次读取一行,然后单独解析每一行? (使用Scanner构造函数,其中String是您读过的行