2012-04-28 67 views
0

我已經在Java中實現了一個非常基本的Stack,它提供了以前從未遇到的奇怪錯誤。 代碼如下: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個元素與下一個適當的/頂部指針集合中的正確的順序被推動完美。 但是,當我嘗試彈出所有元素時,只有它彈出前四(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) 

這些錯誤不會通過引入在推一些打印語句道理給我,而且( )和printStack()來跟蹤它開始拋出更多的隨機異常。 這些錯誤對於每次運行都是完全不確定的,並在不同的機器中給出不同的模式。 我用Netbeans調試器追蹤了一次完整的運行,發現沒有錯誤!

非常感謝您的幫助! 謝謝!

+0

也許它沒有任何關係,但我會聲明pop和push方法同步。而且我也會在peek方法中驗證top不爲空 – BWitched 2012-04-28 10:20:42

回答

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++) 

,因爲你的堆棧大小與每個迭代減少。

+0

非常感謝您的回覆! – 2012-04-28 10:29:42

+0

你的兩點都是正確的,並解決了問題。對於第一點,位置從1移動到s。getSize()是可以理解的,但是在那種情況下,錯誤應該在最後一次迭代時拋出,當它超出界限時。但是從某些輸出可以看出,NullPointerException錯誤出現在隨機迭代中,其中一些出現在開始和中間迭代中。爲什麼這樣? – 2012-04-28 10:33:17

+0

我真的不知道爲什麼異常堆棧跟蹤開始在拋出異常之前打印。 – 2012-04-28 10:39:49

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

導致堆棧大小減小用於每個彈出,我將每個流行增加。當它完成4次彈出時,堆棧大小等於i的值。因此,打印堆棧停在中間。

更換上面循環具有以下

for (; !s.isEmpty();) 

將解決這個問題。

0

printStack()失敗,因爲您沒有檢查n爲空。以下代碼修復了此問題。

`public void printStack(){ Node 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--; 
    } 
}`