【问题标题】:How can I reverse individual words in a string while using a stack?如何在使用堆栈时反转字符串中的单个单词?
【发布时间】:2013-01-19 23:42:42
【问题描述】:

我是编程新手,我正在学习初级编程课程。我试着四处寻找我的答案,我发现了可能有效的结果,但我不明白如何在使用堆栈时实现它们。我试图在不反转整个字符串的情况下反转字符串的单个单词。

例如:用户输入句子“Pies are great!”我需要输出为“seiP era !taerg”

到目前为止,我已经成功编写了一个程序,它将完全反转一个字符串,所以使用上面的例子的输出是:“!taerg era seiP” 正如你所看到的,我想反转单词本身而不颠倒单词的顺序,但我必须使用堆栈获取输入。

以下是我目前所拥有的:

public class ReversedString{

private static  ArrayStack<String> stack;

public static void main(String[] args) {
    stack = new ArrayStack<String>();
    String string = "";
    String stringReversed = "";

    @SuppressWarnings("resource")
    Scanner scanner = new Scanner(System.in);
    System.out.print("Enter the string that you want to reverse: ");
    string = scanner.nextLine();
    string.split(" ");

    for(int i=0; i<string.length(); i++){
        stack.push(string.substring(i, i+1));
    }   

    while(!stack.isEmpty()){
        stringReversed += stack.pop();
    }

    System.out.println("The reverse of the string is: " + stringReversed);

【问题讨论】:

  • 如果你能够反转字符串,单词有什么问题?
  • 我不明白如何利用堆栈来压入字符串并弹出单个反转的单词。
  • 而不是完整的字符串推送单个单词并执行相同操作,直到处理整个字符串。

标签: java string stack reverse


【解决方案1】:

用空格(" ")分割句子,比如String#split,你会得到分割后的字符串,这些字符串将是单词(“Pies”,“are”,“great!”),然后将其推入堆栈并单独弹出值。

String str ="Pies are great!";
String[] strs = str.split(" "); // "Pies", "are", "great!"
String newStr = "";
for(String str1:strs){
   //push str1
   // pop str1 and add it to newStr
}

【讨论】:

    【解决方案2】:
    read character
    while character is whitespace
        // do nothing to skip multiple whitespaces.
        read character
    
    while character is not whitespace
        push character onto stack
        read character
    
    // Just read a word, so now dump it back out.
    while stack is not empty
        ch = pop stack
        print ch
    

    显然这需要在一个循环中做多个单词。

    read character的示例实现

    int index = 0;
    String theString = "Pies are great!"
    
    char readCharacter()
    {
        // TODO: needs error checking so you don't run off the end of the string.
        char ch = theString.charAt(index);
        index++;
        return ch;
    }
    

    【讨论】:

    • 这看起来最有希望,但是我怎样才能准确地读取字符串中的字符呢?
    • 如果您已经有了字符串,您可以使用charAt 并增加索引。我将进行编辑以提供示例。
    【解决方案3】:

    试试

        Scanner sc = new Scanner("Pies are great!");
        while(sc.hasNext()) {
            System.out.print(new StringBuilder(sc.next()).reverse() + " ");
        }
    

    输出

    seiP era !taerg 
    

    或使用 java.util.Stack

        StringBuilder sb = new StringBuilder();
        Scanner sc = new Scanner("Pies are great!");
        while (sc.hasNext()) {
            Stack<Character> st = new Stack<>();
            for (char c : sc.next().toCharArray()) {
                st.push(c);
            }
            while (!st.isEmpty()) {
                sb.append(st.pop());
            }
            sb.append(' ');
        }
        System.out.print(sb);
    

    输出

    seiP era !taerg 
    

    【讨论】:

    • 这正是我正在寻找的,但不幸的是,我们还没有在课堂上讨论过 StringBuilder,我也不知道它是如何工作的。有没有办法在不使用 StringBuilder 的情况下做到这一点?
    【解决方案4】:

    获取您已经编写的代码,以使用堆栈反转整个字符串,并将其转换为自己的方法。您的堆栈对于以相反顺序(后进先出)检索字母很有用。比如:

    public String reverse(String str) {
      . . .
    }
    

    在您的 main 方法中,将您的 String 拆分为多个单词,然后将每个单词迭代地传递给您的 reverse 方法。不要为你的话使用堆栈。你的话是先进先出,堆栈提供后进先出。

    【讨论】:

      猜你喜欢
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      相关资源
      最近更新 更多