-2

私のコードは基本的に、順序付けられたシーケンス 1,2,3..,n を使用して、スタックを一時ストレージ構造として使用して、ユーザーが指定したこのシーケンスの順列を生成できるかどうかをチェックするプログラムです。ユーザーは、n を入力するオプションと、2 つの方法を使用して生成された表示したい順列を選択できます。テキストファイルを介して、またはコマンドラインで直接。したがって、たとえば、ユーザーが 5 1 3 5 4 2 と入力すると、n は最初の数字、つまり 5 として解釈され、残りの数字は、次から生成できるかどうかを確認したい順列です。 1 2 3 4 5 (1 2 3 4 5 が順序付けられ、1 がそのスタックの一番上にあることに注意してください)。ここでは、1 が直接使用され、次に 2 がスタックに格納され、次に 3 が使用され、次に 4 が 2 の上に格納され、次に 5 が使用されます。次に、4 が飛び出し、続いて 2 が飛び出して順列を生成します。私が抱えている問題は、1 2 3 ... n の開始スタックを生成しようとするたびに、プログラムが NullPointerException に直面することです。これは、このコード ブロックの最後の行を指しています。

public static void main(String args[])
{
    int[] arr;
    arr = null;
       try
       {
        if(args[0].charAt(0) == '2') 
        {   
            try
            {   
                FileInputStream file = new FileInputStream(args[1]);
                arr = input(file);
            }
            catch (FileNotFoundException e)
            {
                System.out.println("File not found.");
                System.exit(0);
            }
        }
        else if (args[0].charAt(0) == '1')
        {   
            arr = input();
        }   
           else 
        {
            System.out.println("Please enter a valid input option.");
            System.exit(0);
        }
    }
    catch (ArrayIndexOutOfBoundsException e)
    {
        System.out.println("Please enter a valid input option."); 
        System.exit(0);
     }
    int x;
    x = arr.length;
    System.out.println(x);
    ArrayPerm start = new ArrayPerm(x);
    ArrayPerm temp = new ArrayPerm(x);
    for (int i = 0; i < x; i++)
    {
        *start.push(x - i);*        
    }

また、次のことも指摘しています。

public void push(int j)
{
    top++;
    Stack[top] = j;
}

ArrayPerm クラスは基本的にスタック実装です。私はこれをやってみました:

public void push(Integer j)
{
    if (j == null)
    {
        throw new NullPointerException("NULL ELEMENT!");
    }
    else
    {
        top++;
        Stack[top] = j;
    }
}

しかし、それはまだ例外を示しています。誰かが私を正しい方向に向けることができれば、本当に感謝しています。コード内の問題を探すのに 1 時間費やしましたが、結果はありませんでした。それでは、よろしくお願いします!

編集:これはクラスの定義方法であるため、スタックを初期化するべきではありませんか?

public class ArrayPerm
{
  private int[] Stack;
  private int top;
  public int size;

public ArrayPerm(int n)
{
    size = n;
    int[] Stack = new int[n];
    top = -1;
}
4

2 に答える 2

1

変数をシャドウイングしていますStack。交換

int[] Stack = new int[n];

stackArray = new int[n];
于 2012-08-25T13:04:31.567 に答える
0

「Stack」メンバー変数を初期化していません。

于 2012-08-25T12:32:12.110 に答える