2013-03-08 19 views
7

Jestem tu nowy, także w programowaniu. Próbuję studiować inne tematy sam, ponieważ mój instruktor nie jest wystarczająco pomocny, gdy mam pytanie, więc tutaj jest. Chcę odwrócić słowo z ogólnym stosem.Odwracanie słowa ze stosem

Moje pop, push, isEmpty i peek metody działają (testowałem je za pomocą prostszego programu, który zrobiłem, zanim wypróbowałem to na tym.), A wynik wydaje mi się odwrotnym słowem char przez char, ale zawsze dając mi zerowy przed każdym char!

Moje pytania są następujące: Dlaczego tak się dzieje? I chociaż mam metodę expandCapacity do pracy, gdy pojemność wynosi 9, ale nie ma zastosowania, gdy dane wejściowe przekroczy limit.


Oto mój 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); 

     } 

    } 
} 

Oto wyjściowy

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: oto sposoby, że powiedziałem, że pracowali.

@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

Choć doceniam, że mówiłeś, że to działa, możesz podać nam kod w metodzie expandCapacity i isEmpty, żeby dać nam trochę więcej wgląd dlaczego tak jest dzieje się :) – christopher

+0

Czy jesteś pewien, że to ten sam kod generujący dane wyjściowe - "Enter a word" vs "Enter a sentence" –

+0

zauważa: 'expandCapacity' zostaje wywołane 10 razy, jeśli' in.length() 'wynosi 10, czy to zamierzony? Również 'in' i' out' powinny bardziej poprawnie być zmiennymi lokalnymi w main, nie statycznymi (przynajmniej jeśli był to "prawdziwy" program). – hyde

Odpowiedz

1

Nie jestem pewien, dlaczego trzeba się ExpandCapacity trochę tam, to działa 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

Myślę, że implementacja stosu była oparta na tablicy elementów. the expandCapacity był tam, aby zwiększyć rozmiar tablicy, gdy jest taka potrzeba. – christopher

+0

Witam Chrisa, który działa poprawnie i masz rację w expandCapacity, ale co jeśli w klasie Stack był parametr wejściowy w głównej klasie na przykład: Stack chStack = new Stack (word); Jak to możliwe, że można go odczytać jak ten Ciąg? Kiedy próbowałem używać wejścia, wyprowadzałem je tylko wtedy, gdy było spacje. Dziękuję bardzo za pomoc! –

+0

Nie bardzo rozumiem, o co pytasz? Czy chcesz przeczytać słowo, aby odwrócić z konsoli? Odpowiedź user366722 powinna zadziałać. – Thousand

6
private static String out; 

Wartość w out jest null.

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

Stąd wartość pusta na początku wydruku.

Wystarczy utworzyć nowy obiekt String dać out początkową wartość:

private static String out = ""; 
+0

Dzięki! Całkowicie zapomniałem, że działa jak zmienna licznika, której używasz do przechowywania sum wartości, ale w tym przypadku są to ciągi, ale wymaga to przypisania. Dziękuję Ci bardzo. –

+0

Jeśli ta odpowiedź była dla Ciebie pomocna, oznacz ją jako poprawną. – christopher

1

Istnieje kilka uwag:

  • nie piszesz ogólna klasa więc spadać.
  • Pozostaw iterację tak, jak to możliwe.
  • Spróbuj używać klas standardowych Java tak bardzo, jak to możliwe, w tym przypadku Stos zamiast ArrayStack.
  • Nie trzeba zmieniać rozmiaru stosu, będzie on obsługiwał swój rozmiar dynamicznie podczas wprowadzania większej ilości danych.
  • Powinieneś napisać napis, gdy skończysz tworzenie go nie raz na każdym kroku.
  • Dołączanie ciągów przy użyciu + jest bardzo nieefektywne. Użyj StringBuilder.
  • Stosuj metody, dzięki którym twój kod będzie czytelny.

Herezje 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

Dziękuję. Nie wiedziałem, że był konstruktor String, który powinien być bardziej przydatny! Mam metody, ale są w różnych klasach przepraszam, jeśli nie opisuję tego. –

Powiązane problemy