使用Stack反转句子中的单词

时间:2017-05-02 03:19:32

标签: java

如果我一次输入一系列单词,我的反向方法是否有效?

我的任务是:编写一个完整的方法,从用户那里读取一系列字符串。用户输入"结束"停止输入单词。然后,按照输入方式的相反顺序输出字符串。不要输出字符串“end” 使用堆栈完成此任务。仅调用堆栈对象上的push,pop,peek和isEmpty方法。

以下是它应该如何运行:

Enter a word or 'end' to quit: Hello
Enter a word or 'end' to quit: Java
Enter a word or 'end' to quit: World
Enter a word or 'end' to quit: end
You entered (in reverse):
World
Java
Hello

但我的奔跑:

Enter a word or 'end' to quit: Hello
Enter a word or 'end' to quit: Java
Enter a word or 'end' to quit: World
Enter a word or 'end' to quit: end
You entered (in reverse): end 

这是我到目前为止所做的:

import java.util.Scanner;
import java.util.Stack;
import java.util.regex.Pattern;

public class Stack1 {

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    String input = "end";
    do {
    System.out.printf("Enter a word or 'end' to quit: ");
    input = scanner.nextLine();

    if (input == null || input.length() == 0) {
        System.out.println("Invalid! Try again...");
        return;
    }
    } while(!input.equalsIgnoreCase("end"));
    String reverse = reverse(input);
    System.out.printf("You entered (in reverse): %s", reverse);
} 

private static String reverse(String inputString) {
    String[] str = inputString.trim().split(Pattern.quote(" "));
    Stack stack = new Stack();

    for(String input : str) {
        stack.push(input);
    }

    StringBuilder builder = new StringBuilder();
    while( !stack.isEmpty()) {
        builder.append(stack.pop()).append(" ");
    }
    return builder.toString();
}

}

5 个答案:

答案 0 :(得分:1)

  1. 读取输入。
  2. 将它推入堆栈。
  3. 如果输入等于“结束”,则停止读取输入。
  4. 弹出堆栈直到堆栈变空。

    代码

     import java.util.Scanner;
     import java.util.Stack;
    
      public class Stack1 {
    
      public static void main(String[] args) {
          Scanner in = new Scanner(System.in);
    
          String input = "";
          Stack stack = new Stack();
          while(true){
              System.out.printf("Enter a word or 'end' to quit: ");
              input = in.next(); // to read a word use next() method.
              if(input.equalsIgnoreCase("end")){ break; }
              if(!input.equals("")) stack.push(input);
          }
          System.out.println("You entered (in reverse): ");
          while(!stack.isEmpty())
              System.out.println(stack.pop());
         } 
      }
    

答案 1 :(得分:0)

你的循环在每次迭代时都会覆盖input。为了使其与您的reverse()方法一起使用,您需要使用空格以递增方式连接每个单词:

String input = "";
while (true) {
    System.out.printf("Enter a word or 'end' to quit: ");
    String next = scanner.nextLine();

    if (next == null || next.length() == 0) {
        System.out.println("Invalid! Try again...");
        return;
    }

    if (next.equalsIgnoreCase("end")) {
        break;
    }

    input += next + " ";
}

或者,您可以直接在循环中填充堆栈并跳过字符串拆分:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    Stack<String> stack = new Stack<>();

    while (true) {
        System.out.printf("Enter a word or 'end' to quit: ");
        String next = scanner.nextLine();

        if (next == null || next.length() == 0) {
            System.out.println("Invalid! Try again...");
            return;
        }

        if (next.equalsIgnoreCase("end")) {
            break;
        }

        stack.push(next);
    }

    System.out.println("You entered (in reverse):");

    while (!stack.isEmpty()) {
        System.out.println(stack.pop());
    }
}

请注意,后一种解决方案正确地反转了多字输入,而连接方法无法区分线条和单词。

答案 2 :(得分:0)

String reverse = reverse(input);//input="end"   问题来自这个地方

@Toby Speight感谢您的建议。

顺便说一下,我是英国新人,我很高兴接受任何建议。 我想说的是在你遇到问题时学习调试你的程序。在这种情况下:你希望程序打印一个反向的字符串到控制台。但你有一个奇怪的答案。现在你需要考虑在哪里答案可能来自? 然后在使用之前打印它,如下所示

String reverse = reverse(input);//we said you think the problem comes from this place.
System.out.printf("%s%n",input);//this is a key statement to debug--just print it

现在你然后考虑input不在你想要的地方?然后只考虑input来自哪里?继续这样做,然后你就可以找到它 你的问题来自。

另一方面,有很多方法需要调试,你可以使用IDE调试你的程序,它会更高效,你可以使用日志文件等等。

答案 3 :(得分:0)

这是因为您的输入变量仅包含&#34; end&#34;。因此,无论何时调用反向函数,它只会反转结束字符串。

答案 4 :(得分:-1)

您正在使用do-while循环,这就是为什么&#34;结束&#34;被添加到数组中。

要反转字符串,您可以使用for循环并自行反转:

StringBuilder reverseStr = new StringBuilder();
for (int i = str.size - 1; i >= 0; i--) {
     reverseStr.append(str[i]);
}

或使用类似Apache Commons Lang StringUtils.reverse()的内容。