2013-10-24 93 views
0
public class Stack { 
    Student Sarray[] = new Student[1000]; 
    int nrElem=0; 

    public Student[] getAll(){ 
     return this.Sarray; 
    } 

    public void push(Student x){ 

     this.nrElem++; 
     this.Sarray[this.nrElem]=x; 
    } 
} 

我嘗試手動實現一個堆棧,我有一個小問題。我插入的第一個元素存儲並替換,當我插入另一個。我做錯了什麼?堆棧模擬不存儲元素

public class Ctrl { 
    Stack x = new Stack(); 
public void addC(Student s){ 
    if(findById(s.getId()) != null) { 
     System.out.println("Err!Duplicate id!/n"); 
    } else { 
     if(s.getGrade()>10) 
      System.out.println("Err!Grade bigger than 10!/n"); 
     else{ 
     x.push(s); 
     } 
    } 
} 



public Student findById(int id){ 
    Stack y=new Stack(); 
    y=x; 
    Student z= new Student() ; 

    for(int i=1;i<=y.getNrElem();i++){ 
     z=y.pop(); 
     if (z.getId()==id) 
      return z; 
    } 
    return null;  
} 

2個不同的Stack和Ctrl模塊。現在

Stack y=new Stack(); // creates new reference to new Stack ... 
y=x;     // reference is redirected to point to the class's Stack instance 

Ÿ指向類成員X,你在彈出for循環follwing空:

+0

也許你是錯誤地停止一個新的Stack對象? –

+6

你的代碼存在問題,在push方法中,nrElem的增量必須是在賦值後,或者thisSarray [this.nrElem ++] = x',但是我們需要查看所有其他方法來查看錯誤在哪裏,你沒有顯示findById – RamonBoza

+0

@RamonBoza更新了'findById()' – Matt

回答

1

public Student findById(int id)你做到這一點。 這意味着如果您使用參考號y對數據結構進行了更改,則將使用參考號x來查看這些更改,因爲您正在對同一個實例進行更改。

您可以在堆棧類中執行不會更改堆棧內容的搜索,也可以在您的堆棧的副本上執行此操作。大多數情況下,這是通過在DataStructure的類中提供「Copy」構造函數或「clone()」方法來實現的。

例如改變上述行

Stack y = new Stack(x); 
// y=x We do not need this any more. 

而在棧類中添加:

public Stack(Stack aStack) { 
    System.arraycopy(aStack.Sarray,0,this.Sarray,0,aStack.Sarray.length); 
    // By the way: please start members with a small letter! 

    this.nrElem = aStack.nrElem; 
} 

P.S:並注意RamonBoza的評論,+1他。

1

您正在使用addC插入學生的方法。 它依次調用findById,其中包含以下行:

z=y.pop() 

對於簡單的情況下,有一個在你的流行出棧一個元素,但從來沒有將其推回。 所以要修復它,您需要在彈出它們之後將元素返回到堆棧,或者在類Stack中找到一個方法,該方法可以在不彈出元素的情況下找到元素。

順便說一句,你還沒有提供代碼getNrElem()方法。