4

プログラミング クラスの課題に取り組んでいますが、問題が発生したため、他にどこを見ればよいかわかりません。基本的に、質問は回文をチェックするプログラムを書くことを求めています。

  • ユーザーがテキストを入力します (英数字以外の文字は使用できません)。
  • String は一度に 1 文字ずつスタックにプッシュされます
  • 文字は一度に 1 つずつスタックから引き出され、文字列が逆になります。
  • 元が逆と同じ場合、回文があります

ループに問題がありますが、ここからどこに行けばよいかわかりません。誰かアドバイスや指針はありますか? 私は何を間違っていますか?

これが私がこれまでに持っているものです。

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

4 に答える 4

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 を使用したくなるでしょう。

于 2012-01-25T14:44:28.413 に答える
2

PDrome.pop()=reverse.charAt(i);間違っている。

  1. 逆は null -> NullPointerException
  2. 関数に値を代入していますか? (ポップ())

スタックから pop'ping からリバースを構築する必要があります。

したがって、空の文字列から始めてreverse = "";、スタックから取得した文字を追加する必要があります。

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

命名の詳細

フィールド名とメソッド名の先頭には大文字以外を使用してください:

"someIntegerVariable"
"methodForCalculation"

クラス名とインターフェイス名を大文字のみで開始します。

Stack
ArrayList
MyClass

:)

(Java規約より)

于 2012-01-25T14:43:50.467 に答える
2

ここで実際に何をしているのですか?

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

PDrome.pop()一度に1 つずつ取得charして に追加するために使用する必要がありますreverse

于 2012-01-25T14:44:35.390 に答える
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);
}

あなたが見ることができるようにそれははるかに短いです。

于 2012-01-25T16:48:25.103 に答える