7

我是新来的,也是编程新手。我正在尝试单独学习其他主题,因为当我有问题时,我的老师没有足够的帮助,所以就这样吧。我想用通用堆栈反转一个单词。

我的 pop、push、isEmpty 和 peek 方法有效(我用一个更简单的程序对它们进行了测试,然后我在这个程序上尝试了它。)并且输出似乎给我一个 char 一个反向的单词,但之前总是给我一个 null每个字符!

我的问题是:为什么会这样?即使我有一个 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)

编辑:这是我说的有效的方法。

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


    }



}
4

3 回答 3

6
private static String out;

中的值为out空。

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

因此,输出开头的 null 。

您只需要创建一个新的 String 对象来赋予out初始值:

 private static String out = "";
于 2013-03-08T20:03:48.770 回答
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);

    }               
}
于 2013-03-08T20:16:02.300 回答
1

有几点注意事项:

  • 你不是在写一个泛型类所以 drop 。
  • 尽可能多地保留迭代。
  • 尽量使用 Java 标准类,在本例中使用 Stack 而不是 ArrayStack。
  • 您不需要调整堆栈的大小,它会在您放入更多数据时动态处理其大小。
  • 您应该在完成创建字符串后编写字符串,而不是在每一步中编写一次。
  • 使用 + 附加字符串是非常低效的。使用字符串生成器。
  • 使用它们使您的代码可读的方法。

继承人的代码:

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));
  }
}
于 2013-03-08T20:28:33.343 回答