2013-03-08 2 views
7

저는 여기 프로그래밍과 프로그래밍에 익숙합니다. 나는 강사가 충분한 질문이있을 때 도움이되지 않기 때문에 다른 주제들을 혼자서 공부하려고 노력하고있다. 제네릭 스택을 사용하여 역순으로 말하고 싶습니다.스택으로 단어 반전하기

pop, push, isEmpty 및 peek 메서드가 작동합니다. (필자가이 프로그램을 사용하기 전에 만든 간단한 프로그램으로 테스트했습니다.) 출력 결과는 char하지만 역순으로 표시됩니다. 나에게 각 char 앞에 null을 준다!

내 질문 : 왜 이런 일이 발생합니까? 그리고 용량이 9 인 경우 expandCapacity 메서드를 사용할 수 있지만 입력이 제한을 통과 할 때 적용되지 않습니다.


여기 여기 내 코드

package Stack; 

import java.util.Scanner; 

public class ReverseDriver<T> { 
    private static String out; 
    private static String in; 

    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in); 
     System.out.println("Enter your sentence: "); 
     in = input.nextLine(); 
     int size = in.length(); 

     ArrayStack<Character> revStack = new ArrayStack<>(size); 

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

      char u = in.charAt(i); 
      revStack.Push(u); 
      if (in.length() > 9) { 

       revStack.expandCapacity(); 

      } 
     } 

     while (!revStack.IsEmpty()) { 
      char u = revStack.Pop(); 
      out = out + u; 
      System.out.flush(); 
      System.out.print(out); 

     } 

    } 
} 

의 출력

run: 
Enter a word: 
word 
nullr 
nullro 
nullrow 
Exception in thread "main" java.lang.NullPointerException 
    at Stack.ReverseDriver.main(ReverseDriver.java:37) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 2 seconds) 

편집입니다 : 여기에 내가 작업하는 상기 방법이다. out

@Override 
public void Push (T element) 
    { 
    if (count == stack.length){ 
     expandCapacity(); 
    } 
     stack[++count] = element; 


     //System.out.println(count); 
    } 



    @Override 
    public String toString() 
    { 
     String result = "<top of stack>\n"; 

     for (int index=count-1; index >= 0; index--){ 
     result += stack[index] + "\n"; 
     } 
     return result + "<bottom of stack>"; 
    } 





     @Override 
    public boolean IsEmpty() 
    { //Checks if array is empty 
     if(count == 0){ 
     System.out.println("Nothing"); 
     } 

     return count == 0; 


    } 


public T Pop() 
     { 

      T output; 

     output = (stack[count - 1]); 
     count--; 


     return(output); 

     } 



@Override 
    public T Peek() 
     { 
      //looks at the object at the top of this stack without removing it 
    //from the stack. 

      if(stack.length == 0){ 
     // { 
     System.out.println("Cant peek a ghost"); 

      } 

     return(stack[--count]); 

     } 
     // else 
     // { 
    // System.out.println(stack[count-1]); 

     // } 

    // } 

     @Override 
    public int Size() 
    { 
     //Sets the size of this vector 
     if(stack.length == 0){ 
      System.out.println("Nothing inside"); 
     } 

     System.out.println("The array's size is : " + count); 
     return count; 


    } 



} 
+0

내가 감사 드리며 당신이 단지 우리에게이 이유에 좀 더 통찰력을 제공하기 위해, 당신은 우리에게 expandCapacity 및 IsEmpty 함수 방법의 코드를 적어주세요 수 일하고 말했다 일어납니다 :) – christopher

+0

출력을 생성하는 코드가 똑같은가요? "단어 입력"vs "문장 입력" –

+0

메모 :'in.length()가 10이면'expandCapacity'가 10 번 호출됩니다. 의도적 인? 또한'in'과'out'은 statics가 아닌 main의 지역 변수가되어야합니다 (적어도 이것이 "진짜"프로그램이라면). – hyde

답변

1

난 당신이 거기 ExpandCapacity 비트가 필요한 이유를 모르겠어요를,이 aswell 작동합니다

public static void main(String[] args) 
    {  

    String word ="reverse please";  
    Stack<Character> chStack = new Stack<Character>();  
    for (int i = 0; i < word.length(); i ++) 
    {  
     chStack.push(word.charAt(i));  
    } 

    String out = ""; 
    while (chStack.size() != 0) 
    { 
     out += chStack.pop(); 
     System.out.println(out); 

    }    
} 
+0

스택 구현은 요소 배열을 기반으로한다고 생각합니다. expandCapacity는 필요할 때 배열의 크기를 늘리는 것이 었습니다. – christopher

+0

안녕하세요 Chris 완전히 completly 작동하지 및 expandCapacity 맞습니다하지만 주 클래스의 입력에 대한 매개 변수가 Stack 클래스에있는 경우 예 : Stack chStack = new Stack (word); 문자열과 같이 읽으면 어떻게 될까요? 내가 입력을 사용하려고했을 때 그것은 공간이있을 때까지만 출력한다. 도움 주셔서 대단히 감사합니다! –

+0

나는 당신이 무엇을 요구하고 있는지 이해하지 못합니까? 콘솔에서 되돌릴 단어를 읽고 싶습니까? 그 때문에 user366722의 대답이 효과가 있습니다. – Thousand

6
private static String out; 

값은 널이다.

out = out + u; 
// This is null = null + u; 

출력의 시작 부분에 null이 있습니다.

당신은 단순히 out에게 초기 값을 제공하는 새로운 String 객체를 생성해야합니다

private static String out = ""; 
+0

고마워요! 나는 값의 합을 저장하는 데 사용하는 count 변수와 같은 것으로 작동한다는 것을 완전히 잊어 버렸지 만이 경우에는 문자열이지만 할당이 필요합니다. 고맙습니다. –

+0

이 답변으로 도움이 될 경우 올바른 것으로 표시하십시오. – christopher

1

몇 가지 메모가 있습니다 :

  • 일반 클래스이므로 쓰지 않습니다.
  • 가능한 한 반복을 그대로 둡니다.
  • Java 표준 클래스를 가능한 많이 사용하십시오 (이 경우 ArrayStack 대신 Stack).
  • 스택의 크기를 조정할 필요가 없으므로 더 많은 데이터를 입력 할 때 크기가 동적으로 처리됩니다.
  • 모든 단계에서 한번 작성하지 않으면 문자열을 작성해야합니다.
  • +를 사용하여 문자열을 추가하는 것은 매우 비효율적입니다. StringBuilder를 사용하십시오.
  • 코드를 읽을 수있는 방법을 사용하십시오.

을 Heres 코드 :

import java.util.Scanner; 
import java.util.Stack; 

public class ReverseDriver { 
    public static String reverse(String string) { 
    Stack<Character> revStack = new Stack<Character>(); 
    for (char c : string.toCharArray()) { 
     revStack.push(c); 
    } 
    StringBuilder builder = new StringBuilder(); 
    while(!revStack.isEmpty()){ 
     builder.append(revStack.pop()); 
    } 
    return builder.toString(); 
    } 

    public static void main(String[]args){ 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter your sentence: "); 
    String in = input.nextLine(); 
    System.out.println(reverse(in)); 
    } 
} 
+0

감사합니다. 더 유용한 String builder가 있다는 것을 나는 알고있다. 나는 방법을 가지고 있지만, 다른 클래스에있다. 나는 그것을 설명하지 않으면 유감 스럽다. –

관련 문제