Java 使用堆栈和队列的回文

Java 使用堆栈和队列的回文,java,algorithm,stack,queue,Java,Algorithm,Stack,Queue,我正在测试的新样本文本:我妈妈是一个好厨师。虽然有时中午左右她会离开,忘记给我做午饭和汽水@旧的家庭作业又变得有意义了 我的问题是我没有得到正确的输出,因为我的方法只打印*妈妈一个中午我 这都是基于GUI的。我正在读取一个文件并检查回文,然后使用堆栈和队列在我的JTextArea中打印出来 问题是,所有这些都在工作,当我启动程序并附加文本文件时,我只得到第一个回文。所以它会打印mom,这是我的第一个测试用例,但它不会转到后面的任何其他回文 我想我可能在某个时候陷入了代码阻塞的泥潭,但在修补了一天

我正在测试的新样本文本:我妈妈是一个好厨师。虽然有时中午左右她会离开,忘记给我做午饭和汽水@旧的家庭作业又变得有意义了

我的问题是我没有得到正确的输出,因为我的方法只打印*妈妈一个中午我

这都是基于GUI的。我正在读取一个文件并检查回文,然后使用堆栈和队列在我的JTextArea中打印出来

问题是,所有这些都在工作,当我启动程序并附加文本文件时,我只得到第一个回文。所以它会打印mom,这是我的第一个测试用例,但它不会转到后面的任何其他回文

我想我可能在某个时候陷入了代码阻塞的泥潭,但在修补了一天之后,我现在有点卡住了

编辑1:我现在得到了更多的结果

我的方法是,

public void fileDecode() throws FileNotFoundException
    {

        if (fileChoice.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
        {
            file = fileChoice.getSelectedFile();

            scanInput = new Scanner(file);

            while(scanInput.hasNext())
            {

                int nextPalindrome = 0;
                int counter = 0;
                String token = scanInput.next();
                Stack<Character> stk = new Stack<Character>();
                Queue<Character> que = new LinkedList<Character>();
                for (int i = 0; i < token.length(); ++i)
                {
                    stk.push(token.charAt(i));  //pushing all char's onto the stack/queue
                    que.add(token.charAt(i));

                }
                for (int j = 0; j < token.length(); ++j)
                {
                        char tempStk = stk.pop(); //removing them one at a time and checking if they are equal and incrementing counter
                        char tempQue = que.remove();

                        if (tempStk == tempQue)
                        {
                            counter++;
                        }
                }

                if (counter == token.length())
                {
                   build.append(token + " "); //if the counter # was the same as the token's length, than it is indeed a palindrome and we append it into our StringBuilder that we pass to the JTextArea
                   nextPalindrome = token.length();
                } 
            }  
        }
    }

您在while循环外将counter设置为0,因此第二个单词的计数将从第一个单词的计数开始。在while循环中移动计数器=0,它应该可以工作

此外,nextPalindrome似乎没有被使用,即使它被使用,如果你在循环的底部设置它,它在顶部会立即设置为0,因此只有最后一个单词是回文时它才会保持非零

另外,想想第二个for循环中发生了什么。您正在遍历所有字符,并比较堆栈中的字符和队列中的字符。如果这些是不同的,你知道你没有回文,所以一旦你发现了不同,继续循环是没有意义的。你也已经有了一个循环计数器j,所以你不需要另一个。所以我重写了第二个循环和以下条件,如下所示:

            for (int j = 0; j < token.length(); ++j)
            {
                    char tempStk = stk.pop(); //removing them one at a time and checking if they are equal and incrementing counter
                    char tempQue = que.remove();

                    if (tempStk != tempQue)
                        break;
            }

            if (j == token.length())

这是因为在循环完成后,j可以等于token.length的唯一方法是循环完成,这只能发生在没有字符对不相等的情况下。换句话说,所有字符对都相等,这是您想要的。

在while循环中移动它确实会产生更多的结果。然而,我现在得到了一些打印出来的东西,比如,我和a,还有真正的回文“中午”和“妈妈”,我知道我必须进去,并创造更多的条件。你能再解释一下你的第三条留言吗?删除第二个for循环部分。另外,nextPalindrome变量是因为我需要做一些事情,比如,mom是回文,长度等于3。所以你会从妈妈那里拿走第三个标记,这是秘密信息的一部分,只是还没走那么远。哈哈威尔,我和a是回文但是,如果您不想要这些,只需检查token.length==1和loop。我将编辑我的答案以扩展到我的最后一段。@SenjuXo好的,扩展到我的第三段。谢谢@土地管理局我现在一切都好了。我现在所要做的就是找出如何计算回文的长度,然后按照我在侧注第二条评论中提到的那样,以该长度打印标记。