2013-03-08 25 views
7

Burada ve programlamada yeniyim. Eğitmenim yeterli bir yardım olmadığı için tek başıma başka konuları incelemeye çalışıyorum. Genel bir Stack ile bir kelimeyi tersine çevirmek istiyorum.Yığınla Bir Kelimeyi Tersine Çevirme

Benim pop, push, isEmpty ve peek yöntemleri işe yarar (bunları daha önce yaptığım daha basit bir programla test ettim.) Ve çıktı bana tersine çevirilen karakterleri char tarafından her zaman veriyormuş gibi görünüyor. her char önce bana bir null veriyor!

Sorularım: Bu neden oluyor? Kapasite 9 olduğunda çalışmak için bir expandCapacity yöntemim olsa da, ancak giriş sınırı geçtiğinde geçerli değildir.


İşte İşte benim kod

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

     } 

    } 
} 

var Çıktı

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) 

DÜZENLEME var: Burada ben çalıştığını söyledi yöntemleri var. out içinde

@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

ben takdir ederken bunu sadece bize bu yüzden içine biraz daha fazla fikir vermek için, bize expandCapacity ve isEmpty yönteminde kod veriniz olabilir, çalışıyor söyledi oluyor :) – christopher

+0

Bunun çıktısını üreten aynı kod olduğundan emin misiniz - "Enter a word" vs "Bir cümle girin" –

+0

not: 'expand.Capacity 'in.length()' 10 ise 10 kez çağrılır kasıtlı? Ayrıca, '' '' '' '' '' '' '' '' '' ifadesi, statik olarak değil, en azından yerel değişkenler olmalıdır (en azından bu bir "gerçek" program ise). – hyde

cevap

1

i orada ExpandCapacity bit neden ihtiyaç emin değilim, bu lutfen çalışır:

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

Sanırım yığın uygulaması bir dizi öğeye dayanıyordu. expandCapacity, gerektiğinde dizinin boyutunu artırmak için oradaydı. – christopher

+0

Merhaba Chris, tam olarak çalışıyor ve expandCapacity haklısınız ancak Stack sınıfında ana sınıfında girdi için bir parametre varsa, örneğin: Yığın chStack = new Stack (word); Bu String gibi okunması nasıl mümkün olabilir? Girdi kullanmayı denediğimde, sadece bir boşluk olduğunda çıktısı çıktı. Yardımlarınız için çok teşekkür ederim! –

+0

Neyi sorduğunu tam olarak anlamadım? Konsolu tersine çevirmek için kelimeyi okumak ister misiniz? user366722'nin cevabı bunun için çalışmalı. – Thousand

6
private static String out; 

değeri null.

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

Bu nedenle, çıktınızın başlangıcındaki boş değer.

Sadece out bir başlangıç ​​değeri vermek için yeni bir String nesnesi oluşturmanız gerekir:

private static String out = ""; 
+0

Teşekkürler! Bunun bir toplam değeri saklamak için kullandığınız bir sayı değişkeni gibi çalıştığını tamamen unutmuştum ama bu durumda dizgiler ama bir ödeve ihtiyacı var. Çok teşekkür ederim. –

+0

Bu cevap size yardımcı olduysa, lütfen doğru olarak işaretleyin. – christopher

1

Bazı notlar vardır:

  • Genel bir sınıf yazmıyorsunuz, bu yüzden bırakın.
  • Yinelemeyi mümkün olduğunca bırakın.
  • Java standart sınıflarını mümkün olduğunca kullanmaya çalışın, bu durumda ArrayStack yerine Stack.
  • Sen daha fazla veri koymak gibi dinamik olarak boyutunu idare edecek, yığın yeniden boyutlandırmak için gerekmez. Eğer bir kez değil her adımda bunu oluştururken tamamladıktan sonra
  • Sen dize yazmalısın.
  • Dizeleri + kullanarak ekleme çok verimsizdir. StringBuilder kullanın.
  • Kodunuzu okunabilir hale getirme yöntemlerini kullanın.

İşte kod:

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

Teşekkür ederim. Daha kullanışlı olması gereken bir String oluşturucu olduğunu biliyorum! Yöntemlerim var ama bunu tarif ettiğim için özür dilerim. –

İlgili konular