Java 使用堆栈反转句子中的单词

Java 使用堆栈反转句子中的单词,java,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'

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

我的任务是:编写一个完整的方法,从用户那里读取一系列字符串。用户输入“结束”停止输入单词。然后,按与输入相反的顺序输出字符串。不要输出字符串“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();
}

}

每次迭代时,循环都会覆盖
输入。要使其与
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());
    }
}
publicstaticvoidmain(字符串[]args){
扫描仪=新的扫描仪(System.in);
堆栈=新堆栈();
while(true){
System.out.printf(“输入一个单词或“结束”退出:”);
String next=scanner.nextLine();
if(next==null | | next.length()==0){
System.out.println(“无效!请重试…”);
返回;
}
if(next.equalsIgnoreCase(“end”)){
打破
}
stack.push(下一步);
}
System.out.println(“您输入(反向):”;
而(!stack.isEmpty()){
System.out.println(stack.pop());
}
}

请注意,后一种解决方案正确地反转多字输入,而串联方法无法区分行和字。

字符串反转=反转(输入)//input=“end”
问题来自这个地方

@托比·斯佩特谢谢你的建议

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

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
<>现在,你考虑“代码>输入< /代码>在哪里不是你想要的?然后考虑“代码>输入/代码>从哪里来?继续这样做,然后你可以找到哪里。 你的问题来自于


另一方面,有很多方法需要调试,您可以使用IDE调试您的程序,这样会更高效,而且您还可以使用日志文件等等。

您使用的是
do while
循环,这就是为什么要将“end”添加到数组中

要反转字符串,可以使用
for
循环,然后自己反转:

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

或者使用ApacheCommonsLang
StringUtils.reverse()

这是因为您的输入变量只包含“end”。因此,无论何时调用reverse函数,它都只反转结束字符串

  • 读取输入
  • 把它叠起来
  • 如果输入等于“结束”,则停止读取输入
  • 弹出堆栈,直到堆栈变空。

    代码

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

  • 似乎在do while循环的每次迭代中都要覆盖
    输入
    变量。您需要保留已输入的
    String
    值的记录,尽管我不建议在循环中串联字符串,而是使用
    StringBuilder
    ,然后在调用反向方法时转换为
    String
    。为什么每个人都建议OP串联字符串?这是错误的。每个输入的单词都应该添加到循环中的堆栈中,就这样。@TimurA。因为原始问题包含了
    reverse()
    的一个实现,该实现需要一个由空格分隔的字符串。我不知道OP为什么要破坏他们自己的帖子。@shmosel我知道它在那里,但我认为我们应该帮助他们做得更好,不是支持一个正确的,而是一个坏的implementation@TimurA. 这就是为什么我在回答中添加了替代解决方案。在这种情况下,您的输出仅在一行中。而不是三行line@wylasr这是OP的
    reverse()
    实现中的一个(容易修复的)技术问题;我认为这不值得细说。我的第二个解决方案没有正确打印。OP不希望反转字符串。虽然这可能是解决问题的一个有价值的提示,但一个好的答案也说明了解决方案。请提供示例代码来说明您的意思。或者,考虑将此写入评论。