2013-03-08 12 views
7

私はここやプログラミングの面でも新しいです。私はインストラクターが十分な助けを得ていないので、私は他のトピックだけを勉強しようとしています。私はジェネリックスタックで逆の言葉をしたい。スタックを使って単語を反転する

私のpop、push、isEmpty、peekメソッドは動作します(これを試してみる前に簡単なプログラムでテストしました)。出力はcharという逆の単語charを与えているようですが、各チャットの前に私にヌルを与えてください!

私の質問は どうしてですか?そして、私は容量が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) 

EDITです:ここで私が働いていたこと言った方法です。

@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

出力を生成するコードが同じであることを確かめてください - "単語を入力する"と "文を入力する"との比較 –

+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

こんにちはクリスは完全に仕事をし、あなたはexpandCapacityの権利を持っていますが、Stackクラスの中にメインクラスの入力用のパラメータがあったらどうですか? Stack chStack = new Stack (word); その文字列のようにどのように読むことが可能でしょうか?私は入力を使用しようとすると、それはスペースがあったときまで出力します。 ありがとうございました! –

+0

私はあなたが何を求めているのかかなり理解していませんか?あなたはコンソールから逆にする言葉を読みたいですか?そのためにはuser366722の答えが必要です。 – Thousand

6
private static String out; 

outの値がヌルです。

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

したがって、出力の先頭にはnullがあります。

あなたは単にoutに初期値を与えるために、新しいStringオブジェクトを作成する必要があります。

private static String out = ""; 
+0

ありがとう!私は完全に値の合計を格納するために使用するカウント変数のような作品を忘れていますが、この場合は文字列ですが、割り当てが必要です。どうもありがとうございました。 –

+0

この回答が役に立った場合は、正しいものとしてマークしてください。 – christopher

1

いくつかのノートがあります:

  • あなたはジェネリッククラスのsoを書いていません。
  • できるだけ繰り返しのままにしておいてください。
  • できるだけJava標準クラスを使用してください。この場合、ArrayStackではなくStackです。
  • スタックのサイズを変更する必要はありません。データを入れたときにサイズが動的に処理されます。
  • 作成すると、すべてのステップで一度作成する必要はありません。
  • +を使用して文字列を追加するのは非常に効率が悪いです。 StringBuilderを使用します。
  • コードを読めるようにするメソッドを使用します。相続人

コード:

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

ありがとうございます。私は文字列ビルダーがあったことを知っています。私は方法を持っていますが、私はそれを説明していない場合、彼らは異なるクラスにあります。 –

関連する問題