Bonjour,

je dois créer ma propre pile LIFO qui fournit les méthodes suivantes:

public void Push(Object ThisObj)
ThisObj est inséré en tête de la pile. Si la pile était vide avant l'appel de cette méthode, ThisObj sera le seul élément de la pile

public Object Pop()
Si la pile n'est pas vide, Pop() renvoie la référence qui est en haut de la pile et enlève cet élément de la pile. Sinon un null est renvoyé

public Iterator iterator()
Crée un Iterator object pour la pile LIFO et retourne la référence



J'ai donc d'abord créé l'interface pour la pile LIFO
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
import java.util.*;
 
public interface LIFO_Interface{
	public void push (Object ThisObj);
	public Object pop ();
	public Iterator iterator ();
}

Puis la classe utilisée pour la liste chaînée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
public class LLNode{
	private LLNode next;
	private Object data;
 
	public LLNode (Object o){
		data = o;
	}
 
	public Object getData(){
		return data;
	}
 
	public void setNext (LLNode thisNode){
		next = thisNode;
	}
 
	public LLNode getNext(){
		return next;
	}
}


Ensuite, j'ai écrit la classe qui implémente l'interface pour la pile LIFO utilisant une liste chaînée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
import java.util.*;
 
public class LLStack implements LIFO_Interface {
	private LLNode head;
 
	public LLStack(){
		head = null;
	}
 
	public void push (Object thisObj){
		LLNode tmp = new LLNode (thisObj);
		tmp.setNext(head);
		head = tmp;
	}
 
	public Object pop (){
		Object data = new Object();
		if(head == null)
			return null;
		else{
			data = head.getData();
			head = head.getNext();
			this.iterator().remove();
		}
		return data;
	}
 
	public Iterator iterator(){
		LLStackIterator elements = new LLStackIterator(this);
		return elements;
	}
 
	public LLNode getHead (){
		return head;
	}
}
Où iterator() retourne une instance de la classe LLStackkIterator (que je crée ci dessous)


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
import java.util.*;
 
public class LLStackIterator implements Iterator{
	private LLNode cursor;
 
	public LLStackIterator (LLStack thisStack){
		LLNode cursor = new LLNode(null);
		cursor.setNext(thisStack.getHead());
	}
 
	public boolean hasNext(){
		return ( cursor.getNext() != null );
	}
 
	public Object next(){
		cursor = cursor.getNext();
		return (cursor.getData());
	}
 
	public void remove(){
	}
}

Puis j'ai testé tout ça avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
import java.io.*;
 
public class Test{
	public static void main(String[] args){
		LLStack stack = new LLStack();
		stack.push("object1");
		stack.push("object2");
		stack.push("object3");
		stack.push("object4");
		while (stack.iterator().hasNext()){
		//for(int i=0; i<4; i++){
			System.out.println(stack.iterator().next());
		}
		while (stack.iterator().hasNext());
		do{
			stack.pop();
			System.out.println(stack.getHead().getData());
		}
		while (stack.iterator().hasNext());
	}
}

Evidemment ça ne marche pas
J'obtiens
Exception in thread "main" java.lang.NullPointerException
at LLStackIterator.hasNext(LLStackIterator.java:13)
at Test.main(Test.java:10)

Manifestement je n'ai rien compris quant au "comment marche un Iterator"
A moins que ça soit totalement autre chose
Ou un combo peut etre
L'erreur est sans doute d'une stupidité confondante et hilarante pour certains d'entre vous. Je renverrai respectueusement et humblement au [Débutant] ;-)
Enfin bref, un peu d'aide serait le bienvenu