2013-10-24 3 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 разных модуля для стека и Ctrl.

+0

Возможно, вы ошибочно перехватили новый объект Stack? –

+6

есть проблема в вашем коде, в методе push, приращение nrElem должно быть после назначения, или 'this.Sarray [this.nrElem ++] = x', но нам нужно увидеть все другие методы, чтобы увидеть, где ошибка , вы не показали findById – RamonBoza

+0

@RamonBoza обновлен с помощью 'findById()' – Matt

ответ

1

В public Student findById(int id) вы это делаете:

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

Y точку теперь к члену класса X, который вы поп пустым в follwing цикла. Это означает, что если вы вносите изменения в структуру данных, используя ref y, эти изменения будут видны с использованием ref x, так как вы делаете изменения в том же экземпляре.

Вы можете осуществить поиск в Stack-Class, который не меняет содержимое Stack, или вы можете реализовать это на копии вашего стека. В основном это достигается путем предоставления «Copy» -Constructor или «clone()» метода в классе DataStructure.

Например изменить вышеуказанные строки

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

И в Stack класса объявления:

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() метод.

Смежные вопросы