循环和堆栈,回文作业分配

时间:2012-01-25 14:38:35

标签: java palindrome stack

我正在为我的编程课工作,但我遇到了一些困难,我不知道还能在哪里看。基本上这个问题要求我们编写一个检查回文的程序。

  • 用户输入文字(不允许使用非alphanumberic字符。)
  • 将String一次一个字符推入堆栈
  • 每次从堆栈中拉出一个字符,从而反转字符串
  • 如果原件与反面相同,我们有一个回文

虽然我的循环遇到了一些问题但不知道从哪里开始,有没有人有任何建议或指示?我做错了什么?

这是我到目前为止所拥有的。

import java.util.Stack;
import java.util.regex.*;
import javax.swing.*;

public class Question1 {

    static Stack PDrome = new Stack();

    public static String Reverse (String input) {
        String reverse;

        if (input.length() <= 1) {
            return input;
        }   

        //pushing onto the stack
        for (int i=0; i<input.length();i++) {
            PDrome.push(input.charAt(i));
        }


        //popping from the stack into the string
        for (int i=0; i<input.length(); i++) {  
            PDrome.pop()=reverse.charAt(i);
        }  

        return reverse;
    }

    //Illegal char check method
    public static boolean checker (String input) {
        Pattern p = Pattern.compile("[^a-z0-9]", Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(input);
        boolean b = m.find();

        if (b) {
            System.out.println("There is a special character in your string");   
            System.exit(0);
        }   

        return b;    
    }


    //Main
    public static void main (String [] args) {
        //input
        String input = JOptionPane.showInputDialog("Enter text to check if it's a palndrome");

        //error case
        if (input==null); {
            System.out.println("Nothing Entered");
            System.exit(0);
        }

        //checking for illegal chars
        checker(input);
    }
}

4 个答案:

答案 0 :(得分:3)

这部分:

String reverse;
...
//popping from the stack into the string
for (int i=0; i<input.length(); i++)
{   
    PDrome.pop()=reverse.charAt(i);
}  

应该是这样的:

String reverse = "";
...
//popping from the stack into the string
for (int i=0; i<input.length(); i++)
{   
    // appends the popped character to reverse
    reverse += PDrome.pop();
}  

请注意,当附加大量字符串时,这不是最好的方法,因为Java的字符串是不可变的,并且重复附加字符串需要每次都创建一个新字符串。这个问题很小,但实际上并不重要,但是当问题变大时你会想要使用StringBuffer / StringBuilder。

答案 1 :(得分:2)

PDrome.pop()=reverse.charAt(i);错了。

  1. reverse为null - &gt;的NullPointerException
  2. 您是否正在为某个功能分配值? (POP())
  3. 你必须从堆栈弹出“ build 。”

    所以你应该从一个空字符串开始:reverse = "";并添加从堆栈中取出的字符:

    while (!PDrome.isEmpty())
       reverse += PDrome.pop();
    

    命名详情

    请使用非大写字母来开始字段和方法名称:

    "someIntegerVariable"
    "methodForCalculation"
    

    并且只有大写字母来启动类和接口名称:

    Stack
    ArrayList
    MyClass
    

    :)

    (来自Java惯例)

答案 2 :(得分:2)

你在这里做什么?

PDrome.pop()=reverse.charAt(i);

您应该使用PDrome.pop()一次检索一个char并将其附加到reverse

答案 3 :(得分:1)

在我看来,这是一种更清晰的写作方式。这是一种递归方法。

bool isPalindrome(String s)
{
    if(s.length() <= 1)
        return true;

    return s[0] == s[s.length() - 1] && isPalindrome(s.substr(1, s.length() - 2);
}

你可以看到它短得多。