Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Riconoscimento o meno di una stringa
Forum - Java - Riconoscimento o meno di una stringa

Avatar
zabbixasd (Normal User)
Newbie


Messaggi: 1
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 17:12
Martedì, 15/01/2013
ciao vorrei un aiuto per capire come creare un programma in java che consiste nel riconoscere o meno una stringa.

la stringa è questa:

()[]{
{{}
{[]()
{{{[[[[[((())]]]]]}}}
[]{
[](((((((()))))))){{{{{}}}}}
{{{[[[[[((()))]]]]]}}}

in poche parole bisogna rispettare i criteri canonici dell' Algebra , infatti la cosa importante è che le quadre non contengano delle graffe , e che anche le parentesi tonde non contengono parentesi quadre o graffe.

ESEMPIO:
STRINGA RICONOSCIUTA {}(){}(){}[][][]()
STRINGA NON RICONOSCIUTA ()[

Siamo riusciti a implementare un metodo che controlli se le parentesi si aprono e si chiudono , ma non riusciamo a capire come fare per controllare se dentro le parentesi sono contenute parentesi che non potrebbero essere utilizzate.

Qualche idea ?

Grazie mille ,

Fabio

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:27
Giovedì, 17/01/2013
Quello che cercate di riconoscere è una variante del linguaggio di Dyck, che è riconoscibile da automi a pila. In questo caso, se non ricordo male, basta un parser LL(1) per riconoscerlo. Nell'implementarlo, vi basta sapere qual è l'ultimo tipo di parentesi aperta, il che è molto semplice perché basta controllare la cima dello stack.
Una traccia in pseudo codice:

Codice sorgente - presumibilmente VB.NET

  1. function parse()
  2.    // peek() guarda il prossimo carattere in input senza leggerlo
  3.    while (la = peek()) != EOS
  4.       if (la == '(')
  5.          parenteshis()
  6.       elseif (la == '[')
  7.          bracket()
  8.       elseif (la == '{')
  9.          curly()
  10.       else
  11.          error()
  12.       end
  13.    end
  14. end
  15.  
  16. function parenteshis()
  17.     // match consuma il carattere specificato dall'input e lancia un
  18.     // errore nel caso il carattere di input non coincida con quello indicato
  19.     match('(')
  20.     push('(')
  21.     parse()
  22.     pop('(')
  23.     match(')')
  24. end
  25.  
  26. function bracket()
  27.    // stackTop restituisce il carattere in cima allo stack
  28.    if (stackTop == '(')
  29.       error()
  30.    end
  31.    match('[')
  32.    push('[')
  33.    parse()
  34.    pop('[')
  35.    match(']')
  36. end
  37.  
  38. function curly()
  39.    if (stackTop == '(') or (stackTop == '[')
  40.       error()
  41.    end
  42.    match('{')
  43.    push('{')
  44.    parse()
  45.    pop('{')
  46.    match('}')
  47. end


PM Quote