1

我正在读取一个字符串,但在将其推入堆栈并将其排入队列之前,我需要在保持顺序的同时消除所有空格和标点符号。

我是 Java 新手,并尝试了以下引发异常的代码:

     for (int i = 0;i < input.length(); i++){
            String character = Character.toString(input.charAt(i));
            if (charChecker(character)){
                stack.push(character);
                queue.enqueue(character);
            }
        }

    private static boolean charChecker (String character) {
        if (character.equals(" ") || character.equals(".") ||
            character.equals("?") || character.equals("!") ||
            character.equals(",") || character.equals(";") ||
            character.equals(":") || character.equals("-"))
            return false;
        else
            return true;
    }

    int diff = 0;
    for (int i = 0; i < input.length(); i++) {
        String char1 = stack.pop();
        String char2 = queue.dequeue();
        if (!(char1.equalsIgnoreCase(char2))) {
            diff++;
        }
    }

输出:

Enter file name: input1.txt
evil live
Exception in thread "main" java.util.EmptyStackException
  at Stack.pop(Stack.java:22)
  at Palindrome.main(Palindrome.java:57)
4

3 回答 3

2

任何你不能这样做的理由:

String output = input.replaceAll("[.?!,;:-]", "");

对于所有标点符号和空格,您可以使用\W

String output = input.replaceAll("\\W", "");
于 2012-10-16T14:02:21.833 回答
0

请发布完整的代码片段,因为代码片段不包含引发错误的行。

它说您尝试pop()操作的堆栈是空的。您确定pop在堆栈上推送某些内容后会调用它吗?

我很确定您pop在将任何内容放入堆栈之前正在尝试操作。

于 2012-10-16T14:00:25.127 回答
0

问题是你弹出错误的次数。

您没有将input.legnth()字符数放在堆栈上,而是多次调用 pop() 。这是因为您没有将空格和标点字符放在堆栈上。

尝试使用:

while(!stack.empty()) {
        String char1 = stack.pop();
        String char2 = queue.dequeue();
        if (!(char1.equalsIgnoreCase(char2))) {
            diff++;
        }
    }
于 2012-10-16T14:03:48.697 回答