Palindromes使用堆栈和队列

时间:2015-10-18 17:20:10

标签: java algorithm stack queue

我的新示例文本我正在测试:我的妈妈是个好厨师。虽然有时候在中午左右她会离开而忘记让我吃午饭和一些流行音乐。 @Old作业再次变得相关

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

这是基于GUI的。我正在读取文件并检查回文并在我的JTextArea中使用Stacks和Queue's打印出来。

问题是,所有这一切都有效,当我启动程序并附加文本文件时,我只得到第一个回文。所以它会打印出“妈妈”,这是我的第一个测试用例,但它不会出现在其后的任何其他回文中吗?

我以为我可能在某些时候陷入阻止我的代码阻塞但是在修补它一天之后我现在有点陷入困境。

编辑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();
                } 
            }  
        }
    }

1 个答案:

答案 0 :(得分:0)

在while循环之外将counter设置为0,因此第二个单词的计数将从第一个单词的计数开始。在while循环中移动counter = 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()的唯一方法是循环是否完成,这只有在没有字符对不相等时才会发生(换句话说,所有字符对都是相等的,这就是你想要的。)