2013-03-08 2 views
7

Я новичок здесь и в программировании. Я пытаюсь изучить другие темы самостоятельно, так как моему инструктору не хватает помощи, когда у меня возникает вопрос, так что вот оно. Я хочу обратить вспять слово с общим стеком.Реверсирование слова со стеком

My pop, push, isEmpty и peek методы работают (я тестировал их с более простой программой, которую я сделал, прежде чем я попробовал ее на этом.), И результат, кажется, дает мне обратный символ слова char, но всегда давая мне нуль перед каждым символом!

Мои вопросы: Почему это происходит? И хотя у меня есть метод expandCapacity для работы, когда емкость составляет 9, но она не применяется, когда вход проходит лимит.


Вот мой код

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, просто чтобы дать нам больше понять, почему это happening :) – christopher

+0

Вы уверены, что это тот же код, генерирующий вывод - «Введите слово» vs «Введите предложение» –

+0

примечания: 'expandCapacity' вызывается 10 раз, если' in.length() 'равно 10, это намеренным? Кроме того, 'in' и' out' должны быть более корректными локальными переменными в главном, а не статическом (по крайней мере, если это была «настоящая» программа). – hyde

ответ

1

Я не знаю, почему вам нужно ExpandCapacity немного там, это работает как хорошо:

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); Как это можно было бы читать так, как String? Когда я пытался использовать ввод, он выводил только до тех пор, пока не было места. Большое спасибо за вашу помощь! –

+0

Я не совсем понимаю, о чем вы спрашиваете? Вы хотите прочитать слово, которое нужно отменить с консоли? Ответ пользователя366722 должен работать на это. – Thousand

6
private static String out; 

Значение в out равно нулю.

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

Следовательно, нуль в начале вашего вывода.

Вам просто нужно создать новый объект String, чтобы дать out начальное значение:

private static String out = ""; 
+0

Спасибо! Я полностью забыл, что это работает как переменная count, которую вы используете для хранения суммы значений, но в этом случае это строки, но для этого требуется назначение. Большое спасибо. –

+0

Если этот ответ вам помог, отметьте его как правильно. – christopher

1

Есть несколько примечаний:

  • Вы не пишете родовой класс, поэтому снижайтесь.
  • Оставьте итерацию как можно больше.
  • Попробуйте использовать стандартные классы Java как можно больше, в этом случае Stack вместо ArrayStack.
  • Вам не нужно изменять размер стека, он будет обрабатывать его размер динамически, когда вы вставляете больше данных.
  • Вы должны написать строку, как только вы закончите, создавая ее не один раз на каждом шаге.
  • Добавление строк с использованием + очень неэффективно. Используйте 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

Спасибо. Я знаю, что есть строковый строитель, который должен быть более полезным! У меня есть методы, но они находятся в разных классах, извините, если я это описал. –

Смежные вопросы