Bonjour,

Je dois réaliser dans le cadre d'un exercice le programme suivant :


Écrire un programme qui parcourt une expression arithmétique saisie sous la forme d’une
chaîne de caractères et qui utilise une pile pour vérifier si cette expression est correctement parenthésée.
Exemples :
« (5 +3) » est bien parenthésé.
« ((5 +(3))) » est bien parenthésé.
« 5 +3) » est mal parenthésé.
Le principe consiste à parcourir la chaîne de caractères
• en empilant toute nouvelle parenthèse ouvrante lue
et
• en dépilant une parenthèse lors de l’arrivée d’une parenthèse fermante.


En me basant sur mon cours j'ai créé l'interface suivante :

Je pars du postulat suivant :

J'enregistre la chaine de caractère à l'aide d'un scanner
Je la parse le String en détectant les '(' ')' , quand j'ai un '(' je le rajoute dans la pile de type vecteur (pour ne pas être limité par la taille d'un tableau) , quand j'ai un ')' je dépile un élément, si l'expression est correctement écrite, la hauteur de pile finale doit être de 0.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
 
package exercice3;
 
interface Pile<T> { 
 
	boolean estVide();
	Pile<T> push(T e);
	T getTop();
	Pile<T> pop();
 
}
Puis la classe qui l'implémente

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
 
package exercice3;
 
import java.util.*;
 
public class VectMath01<T> implements Pile<T> {
 
 
	private Vector<T> tab;
 
 
	public VectMath01( Vector<T> tab ) { // constructeur de l'objet
 
		tab = this.tab;
 
	}
 
 
	public boolean estVide() {
 
		return tab.isEmpty();
 
	}
 
 
	public Pile<T> push(T e) {
 
		tab.addElement(e);
		return this;
 
	}
 
	public T getTop() {
 
		if (tab.isEmpty() == true) {
 
			throw new IllegalArgumentException("Pile vide");
 
		} else {
 
			return (this.tab).lastElement();
		}
	}
 
 
	public Pile<T> pop() {
 
		if (tab.isEmpty() == true ) {
 
			throw new IllegalArgumentException("Pile vide" );
 
		} else {
 
			tab.remove(this.getTop());
 
			return this;
		}
	}
 
}
Et la classe contenant le Main :

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
 
package exercice3;
 
import java.util.*;
 
public class ExpressionMathematique {
 
	public static void main(String[] args) {
 
		String str;
		char c;
 
		Vector<Character> vc1 = new Vector<Character>();
		Pile<Character> p01 = new VectMath01<Character>(vc1);
 
		str = inputUser();
 
		for (int i = 0 ; i < str.length(); i++) { 
 
			c = (char) str.charAt(i);
 
			if ( c == '(' ) {
 
				p01 = p01.push(c);
 
			} else if ( c == ')' ) {
 
				p01 = p01.pop();
 
			}  
 
		}
 
		if ( p01.getTop() == 0 ) {
 
			System.out.println("L'expression est bien écrite");
 
		} else {
 
			System.out.println("L'expression est male écrite veuillez vérifier la syntaxe");	
 
		}
 
	}
 
	public static String inputUser() {
 
		String expression;
 
		Scanner sc = new Scanner(System.in); 
 
		System.out.println("Entrez l'expression: ");
 
		expression = sc.nextLine(); 
 
		sc.close();
 
		return expression;
 
	}
 
}
A l'exécution la console me retourne l'erreur suivante :

Exception in thread "main" java.lang.NullPointerException
at exercice3.VectMath01.getTop(VectMath01.java:34)
at exercice3.ExpressionMathematique.main(ExpressionMathematique.java:33)

Je suis encore bien novice en java (et en programmation en général) et je m’emmêle encore un peu les pinceaux avec la manipulation des objets.

En vous remerciant par avance je bute depuis un moment sur ce soucis (j'espère ne pas être hors charte :/ )