Parenthésage d'une expression

Parenthésage d'une expression - Java - Programmation

Marsh Posté le 09-05-2009 à 22:55:40    

Bonjour,
 
J'essaie de faire un programme qui vérifie qu'une expression est bien parenthésée.
J'ai un erreur à l'éxecution:

 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at PileArray.pop(PileArray.java
at Parenthesage.verifiParen(Parenthesage.java
at Parenthesage.main(Parenthesage.java

 
Je vois pas d'où vient le problème.
Je vous envoie mon code ci-dessous(qui fait 3 fichiers .java).
Quelqu'un peut m'aider?
 
Merci beaucoup d'avance

 

Code :
  1. //INTERFACE STACK
  2. public interface Stack
  3. {
  4. public Object push(Object i);
  5. public Object pop() ;
  6. public boolean isEmpty();
  7. }


 

Code :
  1. //CLASSE PILEARRAY
  2. import java.util.EmptyStackException;
  3. class PileArray implements Stack
  4. {
  5. Object[] pile;
  6. static int compteur=0;
  7. int debut;
  8. public PileArray()
  9. {
  10.  pile= new Object[10];
  11.  debut=-1;
  12. }
  13. public boolean isEmpty()
  14. {
  15.  return debut == -1;
  16. }
  17. public Object push(Object item)
  18. {
  19.  if(debut 1 < 10)
  20.  {
  21.   pile[ debut] = item;
  22.  }
  23.  return item;
  24. }
  25. public Object pop()
  26. {
  27.  debut--;
  28.  return pile[debut];
  29. }
  30. }


 

Code :
  1. //CLASSE PARENTHESAGE
  2. import java.io.*;
  3. public class Parenthesage
  4. {
  5. public static boolean verifiParen(String s)
  6. {
  7. PileArray stack = new PileArray ();
  8. for (int i = 0; i < s.length(); i )
  9. {
  10. switch (s.charAt(i))
  11. {
  12. case '(':
  13.     stack.push(new Character ('('));
  14. break;
  15. case '[':
  16.     stack.push(new Character ('['));
  17. break;
  18. case '{':
  19.     stack.push(new Character ('{'));
  20. break;
  21. case ')':
  22.     if (stack.isEmpty()) return false;
  23.     Character c = (Character)stack.pop();
  24.     if (!match(c.charValue(), s.charAt(i))) return false;
  25. break;
  26. case ']':
  27.     if (stack.isEmpty()) return false;
  28. c = (Character)stack.pop();
  29.     if (!match(c.charValue(), s.charAt(i))) return false;
  30. break;
  31. case '}':
  32.     if (stack.isEmpty()) return false;
  33. c = (Character)stack.pop();
  34.     if (!match(c.charValue(), s.charAt(i))) return false;
  35. break;
  36. default:
  37. break;
  38. }
  39. }
  40. if (stack.isEmpty())
  41. {
  42.  return true;
  43. }
  44. else
  45.  return false ;
  46. }
  47. public static boolean match(char lpar, char rpar) {
  48. switch (lpar) {
  49. case '(': return rpar == ')';
  50. case '[': return rpar == ']';
  51. case '{': return rpar == '}';
  52. default: return false;
  53. }
  54. }
  55. public static void main(String[] args) throws IOException {
  56. BufferedReader stdr;
  57. stdr = new BufferedReader(new InputStreamReader(System.in));
  58. String line = stdr.readLine();
  59. while (line != null) {
  60. if (verifiParen(line))
  61. System.out.println("well parenthesized" );
  62. else
  63. System.out.println("parenthesis mismatch" );
  64. line = stdr.readLine();
  65. }
  66. }
  67. }


Message édité par anthp le 09-05-2009 à 22:57:38
Reply

Marsh Posté le 09-05-2009 à 22:55:40   

Reply

Marsh Posté le 10-05-2009 à 11:40:41    

La ligne suivante est étrange:

if(debut 1 < 10)


Il est curieux d'appeler le pointeur "debut" alors que ce n'est le début qu'au début, mais pas après.
 
Il est curieux d'initialiser debut à -1 plutôt qu'à zéro.
 
Il serait plus rassurant de blinder le programme en testant si l'on ne dépasse les 10 élements dans le push et en testant 0 dans le cas du pop. Cela peut prendre un pouième de temps de traitement en plus, mais cela n'a pas d'importance, et dans le monde professionnel, il vaut mieux un programme sûr plutôt qu'un programme qui peut devenir défaillant.


Message édité par billgatesanonym le 10-05-2009 à 11:41:33
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed