IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Parenthésage d'une expression


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Par défaut Parenthésage d'une expression
    Bonjour,

    J'essaie de faire un programme qui vérifie qu'une expression est bien parenthésée.
    J'ai pas d'erreurs à la compilation ni à l'exécution. Mais il ne fonctionne pas correctement: toutes les expressions tapées son considérées comme bien parenthésées...
    Je vous envoie mon code ci-dessous, quelque pourrait m'aider? Je vois pas d'où vient le problème.

    Merci beaucoup d'avance.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public interface Stack 
    {
    	public Object push(int i);
    	public Object pop();
    	public boolean isEmpty();
    }
    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
     
     
     
    class PileArray implements Stack 
    {
    	Object[] pile;
    	int debut;
     
    	public PileArray() 
    	{
    		pile= new Object[100];
    		debut=-1;
    	}
     
     
    	public boolean isEmpty() 
    	{
    		return debut == -1;
    	}
     
     
    	public Object push(int item) 
    	{
    		if (debut==pile.length-1)  
    		{
    			pile[++debut] = item;
    		}
     
    		return item;
    	} 
     
     
    	public Object pop() 
    	{
     
    		if(!isEmpty())
    		{
    			debut--;
    		}
     
    		return pile[debut];
    	}
    }

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
     
    import java.io.*;
     
       public class Parenthesage 
       {
     
         public static boolean verifiParen(String s) 
        {
           PileArray stack = new PileArray ();     
     
           for (int i = 0; i < s.length()-1; i++) 
    	{
    		switch (s.charAt(i)) 
    		{
    			case '(':
    					stack.push(new Character ('('));
    			break;
    			case '[':
    					stack.push(new Character ('['));
    			break;
     
    			case '{':
    					stack.push(new Character ('{'));
     
    			break;
    			case ')':
    					Character c = (Character) stack.pop();
    					if (!match(c.charValue(), s.charAt(i))) return false;
    			break;
    			case ']':
     
    					c = (Character) stack.pop();
    					if (!match(c.charValue(), s.charAt(i))) return false;
    			break;
    			case '}':
    					c = (Character) stack.pop();
    					if (!match(c.charValue(), s.charAt(i))) return false;
    			break;
    			default:
    			break;
    		}
           }
     
           if ( stack.isEmpty())
    		return true;
    	else 
    		return false ;
     
         }
     
     
         public static boolean match(char lpar, char rpar) {
           switch (lpar) {
           case '(': return rpar == ')';
           case '[': return rpar == ']';
           case '{': return rpar == '}';
           default: return false;
           }
         }
     
     
         public static void main(String[] args) throws IOException 
         {
    	BufferedReader stdr;  
    	stdr = new BufferedReader(new InputStreamReader(System.in));
     
    	String line = stdr.readLine();   
    	while (line != null) {
             if (verifiParen(line))
               System.out.println("well parenthesized");
             else
               System.out.println("parenthesis mismatch");
     
             line = stdr.readLine();   
           }
         }
       }

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		if (debut==pile.length-1)  
    		{
    			pile[++debut] = item;
    		}
    Comme au départ cette condition est fausse, debut restera indéfiniement à -1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public Object pop() 
    	{
     
    		if(!isEmpty())
    		{
    			debut--;
    		}
     
    		return pile[debut];
    	}
    lors du pop, si c'est vide, tu ne retourne pas d'erreur -> si t'as une parenthèse ouverte pour deux fermantes, tu ne remarquera pas d'erreur (ton code va ignorer la deuxième).

    Comme tu n'incrémente jamais, et que tu ignore les erreurs lors du pop, ta pile reste à vide sans erreur.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Par défaut
    Merci beaucoup pour ta réponse.

    J'ai créé une variable qui indique combien d'éléments il y a dans la pile et je l'incrémente à chaque fois que j'ajoute un élément dans celle-ci. Voici les changements que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public Object push(int item) 
    	{
     
    		if (debut==compteur)  
    		{
    			pile[++debut] = item;
    		}
    		compteur++;
    		return item;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	public Object pop() 
    	{
    		try{
    		debut--;}
    		catch (EmptyStackException e){}
     
    		return pile[debut];
    	}
    Maintenant j'ai une erreur à l'exécution (une exception):
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2
    at PileArray.pop(PileArray.java:40)
    at Parenthesage.verifiParen(Parenthesage.java:26)
    at Parenthesage.main(Parenthesage.java:67)

    Je vois pas où le problème. Est-ce que tu pourrais m'expliquer?
    Merci beaucoup d'avance

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pourquoi tu met un tel if autour de ton empillement? ta ne permet, encore une fois, que l'empilement d'un seul élément! parce que une fois que t'aura fait ++debut, ben la condition debut==compteur ne sera plus valable -> plus aucun empilement ne sera fait.

    Pour ton dépilement, ton exception montre que tu essaie de lire à l'index -2 de ton tableau, ce qui est illogique.
    -> quand l'index est <0, renvoie une erreur, c'est qu'on ferme une parenthèse de trop.

Discussions similaires

  1. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 10h54
  2. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22
  3. [String] rendre une expression reguliere insensible à la case
    Par chimical dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/05/2004, 11h38
  4. "Différence de type dans une expression" Tquery
    Par Hakim dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/04/2004, 00h22
  5. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo