0

私はJavaで非常に基本的なスタックを実装しました。これにより、これまで直面したことのない奇妙なエラーが発生します。コードは次のとおりです。

public class Stack {
Node top;
int size;

public Stack() {top=null; size=0;}

public int pop() {
    if(top!=null) {
        int item = top.data;
        top = top.next;
        size--;
        return item;
    }
    return -1;
}

public void push(int data) {
    Node t = new Node(data);
    t.next = this.top;
    this.top = t;
    size++;
}

public boolean isEmpty() {
    return size<=0 ;
}

public int getSize() {
    return size;
}

public int peek() {
    return top.data;
}

public void printStack() {
    Node n = this.top;
    int pos = this.getSize();
    while(pos>=0) {
        System.out.println("Position: " + pos + " Element: " + n.data);
        if(pos>0) {
            n = n.next;
        }
        pos--;
    }
}
}

class Node {
public int data;
public Node next;

Node(int d) {data=d; next=null;}

public int getData() {return data;}
}

class Tester {
public static void main(String[] args) {
    Stack s = new Stack();
    s.push(9);s.push(2);s.push(7);s.push(3);s.push(6);s.push(4);s.push(5);
    System.out.println("Size is: " + s.getSize());
    //s.printStack();
    for (int i=0; i<s.getSize(); i++) {
        System.out.print(s.pop()+ " ");
    }
    System.out.println();
}
}

私は徹底的にテストし、プッシュ操作が適切な次/トップポインタセットで正しい順序でプッシュされている7つの要素すべてで完全に機能することを発見しました。しかし、すべての要素をポップアウトしようとすると、それだけがトップ4(5-4-6-3)をポップし、他の要素を残します。次に、上記のメソッドを使用してprintStackを実行しようとすると、次のようにランダムなNullPointerExceptionエラーが発生します。

run:
Position: 7 Element: 5
Position: 6 Element: 4
Position: 5 Element: 6
Position: 4 Element: 3
Exception in thread "main" java.lang.NullPointerException
Position: 3 Element: 7
Position: 2 Element: 2
    at Stack.printStack(Stack.java:58)
Position: 1 Element: 9
    at Tester.main(Stack.java:95)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

これらのエラーは私には意味がありません。さらに、push()とprintStack()にさらにいくつかのprintステートメントを導入してトレースすると、よりランダムな例外がスローされ始めます。エラーは実行ごとに完全に非決定的であり、マシンごとに異なるパターンを示します。Netbeansデバッガを使用して1回の完全な実行をトレースしましたが、エラーは見つかりませんでした。

あなたの助けは大歓迎です!ありがとう!

4

3 に答える 3

2

最初のprintStack()方法:

while (pos > 0) {

それ以外の

while (pos >= 0) {

あなたの0の位置は常にnull

そして主に:

int size = s.getSize();
for (int i = 0; i < size; i++)

それ以外の

for (int i = 0; i < s.getSize(); i++)

スタックサイズは反復ごとに減少するためです。

于 2012-04-28T10:20:52.107 に答える
0
for (int i=0; i<s.getSize(); i++) 

は、ポップごとにスタックサイズを減少させ、ポップごとに増加します。4つのポップで完了するまでに、スタックサイズはiの値に等しくなります。したがって、印刷スタックは途中で停止します。

上記のforループを次のように置き換えます

for (; !s.isEmpty();) 

問題を修正します。

于 2013-07-16T08:07:29.627 に答える
0

nがnullであることを確認していなかったため、printStack()が失敗していました。次のコードはこの問題を修正します。

`public void printStack(){ノードn = this.top; int pos = this.getSize();

    System.out.println("Stack Size is " + pos);
    while(n!=null) {
        System.out.println("Position: " + pos + " Element: " + n.data);
            n = n.next;
        pos--;
    }
}`
于 2013-07-16T08:20:59.250 に答える