0

このコードはmain関数内にあります。

Scanner input = new Scanner(System.in);

System.out.println("Type a sentence");
String sentence = input.next();

Stack<Character> stk = new Stack<Character>();
int i = 0;

while (i < sentence.length())
{
    while (sentence.charAt(i) != ' ' && i < sentence.length() - 1)
    {
        stk.push(sentence.charAt(i));
        i++;
    }
    stk.empty();
    i++;
}

そして、これはempty()関数です:

public void empty()
{
    while (this.first != null)
        System.out.print(this.pop());
}

example sentence入力すると、次の出力が得られるため、正しく機能しませんlpmaxe。最初の文字が欠落しており、スペースを越えて文の次の部分までカウントする代わりに、ループが停止します。

私はこれを達成しようとしています:

This is a sentence---> sihT si a ecnetnes

4

6 に答える 6

3

元の投稿への変更によると、OP は現在、彼の目標は文内の単語の文字の順序を逆にすることですが、単語を最初の位置に残すことであることを示しています。

splitこれを行う最も簡単な方法は、String関数を使用し、単語を繰り返し処理し、順序を逆にすることだと思います。

String[] words = sentence.split(" "); // splits on the space between words

for (int i = 0; i < words.length; i++) {
    String word = words[i];
    System.out.print(reverseWord(word));

    if (i < words.length-1) {
        System.out.print(" "); // space after all words but the last
    }
}

メソッドreverseWordは次のように定義されています。

public String reverseWord(String word) {
    for( int i = 0; i < word.length(); i++) {
        stk.push(word.charAt(i));
    }
    return stk.empty();
}

そして、emptyメソッドが次のように変更された場所:

public String empty() {
    String stackWord = "";
    while (this.first != null)
        stackWord += this.pop();
    return stackWord;
}

元の応答

元の質問は、OPが文を完全に逆にしたいことを示していました。

本当に必要のない二重ループ構造があります。

次のロジックを検討してください。

  1. 入力文字列から各文字を読み取り、その文字をスタックにプッシュします
  2. 入力文字列が空の場合、スタックから各文字をポップして画面に出力します。

そう:

for( int i = 0; i < sentence.length(); i++) {
    stk.push(sentence.charAt(i));
}
stk.empty();
于 2012-07-18T15:40:20.060 に答える
1

コードで実行したいことは、文字列全体ではなく、各単語を順番に逆にすることだと思います。したがって、example sentence出力したい入力が与えられた場合、 elpmaxe ecnetnes not ecnetnes elpmaxe .

の代わりに表示される理由は、lpmaxe代わりにelpmaxeがあるため、内側のwhileループが文字列の最後の文字を処理しないためi < sentence.length() - 1ですi < sentence.length()。単一の単語しか表示されない理由は、sentence変数が入力の最初のトークンのみで構成されているためです。これがメソッドのScanner.next()機能です。次の (デフォルトでは) スペースで区切られたトークンを読み取ります。

文全体を入力する場合はSystem.in、次のようにまとめます。

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

と呼び出しますreader.readLine()

お役に立てれば。

于 2012-07-18T15:46:37.610 に答える
0

public class ReverseofeachWordinaSentance {

/**
 * @param args
 */
public static void main(String[] args) {
    String source = "Welcome to the word reversing program";

    for (String str : source.split(" ")) {
        System.out.print(new StringBuilder(str).reverse().toString());
        System.out.print(" ");
    }
System.out.println("");

    System.out.println("------------------------------------ ");
    String original = "Welcome to the word reversing program";
    wordReverse(original);
    System.out.println("Orginal Sentence :::: "+original);
    System.out.println("Reverse Sentence :::: "+wordReverse(original));
}

public static String wordReverse(String original){

    StringTokenizer string = new StringTokenizer(original);

    Stack<Character> charStack = new Stack<Character>();

    while (string.hasMoreTokens()){

    String temp = string.nextToken();

    for (int i = 0; i < temp.length(); i ++){

    charStack.push(temp.charAt(i));
}
    charStack.push(' ');
}

    StringBuilder result = new StringBuilder();
    while(!charStack.empty()){
    result.append(charStack.pop());
}

    return result.toString();   
}

}

于 2013-10-24T06:53:56.780 に答える
0
import java.util.StringTokenizer;
public class stringWork {
public static void main(String[] args) {
    String s1 = "Hello World";
    s1 = reverseSentence(s1);
    System.out.println(s1);
    s1 = reverseWord(s1);
    System.out.println(s1);
}
private static String reverseSentence(String s1){
    String s2 = "";
    for(int i=s1.length()-1;i>=0;i--){
        s2 += s1.charAt(i);
    }
    return s2;
}
private static String reverseWord(String s1){
    String s2 = "";
    StringTokenizer st = new StringTokenizer(s1);
    while (st.hasMoreTokens()) {
        s2 += reverseSentence(st.nextToken());
        s2 += " ";
    }
    return s2;
}

}

于 2012-12-25T00:08:03.273 に答える
0
public class reverseStr {
public static void main(String[] args) {
    String testsa[] = { "", " ", "       ", "a ", " a", " aa bd  cs " };
    for (String tests : testsa) {
        System.out.println(tests + "|" + reverseWords2(tests) + "|");
    }
}

public static String reverseWords2(String s) {
    String[] sa;
    String out = "";
    sa = s.split(" ");
    for (int i = 0; i < sa.length; i++) {
        String word = sa[sa.length - 1 - i];
        // exclude "" in splited array
        if (!word.equals("")) {
            //add space between two words
            out += word + " ";
        }
    }
    //exclude the last space and return when string is void
    int n = out.length();
    if (n > 0) {
        return out.substring(0, out.length() - 1);
    } else {
        return "";
    }
}

}

これはleetcodeで渡すことができます

于 2014-04-18T15:22:30.537 に答える
0

sentenceすでに入力があり、Stack オブジェクトが呼び出されていると仮定するとstk、次のようなアイデアがあります。

char[] tokens = sentence.toCharArray();
for (char c : tokens) {
    if (c == ' ') {
        stk.empty();
        System.out.print(c);
    } else  {
        stk.add(c);
    }
}

したがって、一度に 1 文字ずつスキャンします。スペース文字をヒットすると、単語の終わりをヒットしたと見なされ、その単語を逆に吐き出し、そのスペース文字を出力して続行します。それ以外の場合は、文字をスタックに追加して、現在の単語の作成を続行します。(ピリオドやコンマなどの句読点も許可したい場合は、などに変更if (c == ' ') {してif (c == ' ' || c == '.' || c == ',') {ください。)

なぜ 1 つの単語しか得られないのかについては、darrenp が既に指摘しています。(個人的には、速度が問題にならない限り、BufferedReader の代わりに Scanner を使用しますが、それは私の意見です。)

于 2012-07-19T02:03:08.587 に答える