2017-05-02 1 views
0

일련의 단어를 한꺼번에 입력하면 역방향 방법이 작동합니까?Stack을 사용하여 문장의 단어를 뒤집기

내 임무는 다음과 같습니다. 사용자로부터 일련의 문자열을 읽는 완벽한 방법을 작성합니다. 사용자는 "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 

을하지만 내 실행 :

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

} 
+0

당신이 루프 동안 할 일의 각 반복에서 당신의'input' 변수를 덮어 쓰는 것 같다. 루프 내에서 문자열을 연결하는 것을 권장하지 않지만, _reverse_ 메소드를 호출 할 때'StringBuilder'를 사용하여'String'으로 변환 할 것을 권장하지만, 이미 입력 된'String' 값의 레코드를 유지해야합니다. –

+0

누구나 OP가 문자열을 연결하도록 제안하는 이유는 무엇입니까? 그건 잘못된 것입니다. 입력 된 각 단어는 루프의 스택에 추가되어야합니다. – tima

+1

@ 티 무라. 원래의 질문에는 단어가 공백으로 구분 된 단일 문자열을 예상하는'reverse()'구현이 포함 되었기 때문입니다. 왜 OP가 자신의 게시물을 왜곡 한 것인지 잘 모르겠습니다. – shmosel

답변

0

루프가 덮어 쓸 수 있습니다 :

여기
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 

내가 지금까지 무엇을 가지고 여기에

은 실행하도록되어 어떻게 각 반복마다 input. 그것은 당신의 reverse() 방법으로 작동하게하려면 공백으로 점진적으로 각 단어를 CONCAT 할 수 있습니다 :

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

후자의 솔루션은 다중 단어 입력을 올바르게 반전하는 반면 연결 방법은 라인과 단어를 구분할 수 없다는 점에 유의하십시오.

+0

이 경우 출력은 한 줄로되어 있습니다. 세 줄이 아닙니다. – wylasr

+0

@wylasr OP의'reverse()'구현에서 (쉽게 고쳐진) 전문성입니다. 나는 그것이 살기에 가치가 있다고 생각하지 않았다. 내 두 번째 해결책은 올바르게 인쇄됩니다. – shmosel

0

String reverse = reverse(input);//input="end" 문제는이 곳에서 조언을

@Toby Speight 덕분에 온다.

저는 신입생입니다. 저는 어떤 제안이라도 받아 들일 수있어서 기쁩니다. 내가 말하고자하는 것은 문제를 만났을 때 프로그램을 디버그하는 법을 배우는 것입니다.이 경우 : 프로그램이 콘솔에 역순으로 된 문자열을 인쇄하도록합니다. 그러나 이상한 대답을 얻었습니다. 답변의 위치를 ​​고려해야합니다. 어쩌면 온거야? 당신은 이제 당신과 다음 input 당신이 원하는 것을하지 어디 고려

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이 어디서 왔는지 생각해보십시오.이 작업을 계속 수행하면 에서 문제가 발생하는 곳을 찾을 수 있습니다.

다른 한편으로 디버깅 할 방법이 많습니다. IDE 디버그 프로그램을 사용할 수 있으며 더 효율적입니다. 로그 파일을 더 많이 사용할 수 있습니다.

+0

이 문제를 해결하는 데 도움이되는 힌트 일 수도 있지만 좋은 대답은 솔루션을 보여줍니다. 의미를 나타내는 예제 코드를 제공하려면 [편집]하십시오. 또는 이것을 주석으로 쓰는 것을 고려하십시오. –

-1

do-while 루프를 사용하고 있습니다. 따라서 "end"가 배열에 추가됩니다.

문자열을 바꾸려면, 당신은 for 루프를 사용하고 스스로를 반전 할 수 있습니다 :

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

또는 아파치 코 몬즈 랭 StringUtils.reverse() 같은 것을 사용합니다.

+0

OP가 문자열을 뒤집어 쓰려고하지 않습니다. – shmosel

0

입력 변수에 "end"만 포함되어 있기 때문입니다. 따라서 reverse 함수를 호출 할 때마다 end String 만 되돌립니다.

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()); 
        } 
        } 
    
관련 문제