Newsgroup: it.comp.lang.pascal
Titolo: Stringhe di Parentesi

Esercizio 1. Stringhe di parentesi 
Si vuole scrivere un programma che legge da input una sequenza di parentesi tonde e quadre terminata da un punto e risponde SI se le parentesi sono aperte e chiuse correttamente, NO altrimenti. 
Esempio: Per la seguente stringa di input: 
([ ]( [()] )) .
la risposta č SI. Mentre per le stringhe 
([ ].
([ )].
([ ]) ].
la risposta č NO, dato che: nel primo caso, non tutte le parentesi aperte sono chiuse prima della fine della stringa; nel secondo caso, si chiude la parentesi tonda piů esterna prima di aver chiuso la quadra; nel terzo caso, l'ultima parentesi quadra chiusa non corrisponde a nessuna parentesi aperta. 
Soluzione iterativa: Si provi a trovare un programma iterativo che risolve il problema leggendo la stringa di input una sola volta.
Suggerimento: Si utilizzi una pila per memorizzare le parentesi aperte non ancora chiuse. 
CHI SA AIUTARMI ?!?!
----------------------------------------------
Virgilio Mail - Il tuo indirizzo E-mail gratis
http://mail.virgilio.it
-- 
Posted from [212.216.176.201] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

a un punto e risponde SI se le parentesi sono aperte e chiuse correttamente, NO altrimenti. 
Aggiungi il controllo del punto finale :
program Parentesi ;
var EquilibrioTonde  : Integer ;
    EquilibrioQuadre : Integer ;
    StringaParentesi : String ;
    I     : Integer ;
    Stato : Integer ;
    C     : Char ;
    procedure ExitWithError ;
    begin
      WriteLn( 'NO') ;
      Halt ;
    end ;
begin
  Stato := 0 ;
  EquilibrioTonde := 0 ;
  EquilibrioQuadre := 0 ;
  Write( 'Inserire la stringa di parentesi : ' ) ;
  ReadLn( StringaParentesi ) ;
  for I := 1 to Length( StringaParentesi ) do
  begin
    C := StringaParentesi[I] ;
    case Stato of
         0 : case C of
                  '(' : begin
                          Stato := 1 ;
                          Inc(EquilibrioTonde) ;
                        end ;
                  '[' : begin
                          Stato := 2 ;
                          Inc(EquilibrioQuadre) ;
                        end ;
             else
                  ExitWithError ;
             end ;
         1 : case C of
                  '(' : Inc(EquilibrioTonde) ;
                  ')' : begin
                          Stato := 3 ;
                          Dec(EquilibrioTonde) ;
                        end ;
                  '[' : begin
                          Stato := 2 ;
                          Inc(EquilibrioQuadre) ;
                        end ;
             else
                  ExitWithError ;
             end ;
         2 : case C of
                  '[' : Inc(EquilibrioQuadre) ;
                  ']' : begin
                          Stato := 4 ;
                          Dec(EquilibrioQuadre) ;
                        end ;
                  '(' : begin
                          Stato := 1 ;
                          Inc(EquilibrioTonde) ;
                        end ;
             else
                  ExitWithError ;
             end ;
         3 : case C of
                  ')' : Dec(EquilibrioTonde) ;
                  '(' : begin
                          Stato := 1 ;
                          Inc(EquilibrioTonde) ;
                        end ;
                  '[' : begin
                          Stato := 2 ;
                          Inc(EquilibrioQuadre) ;
                        end ;
                  ']' : begin
                          Stato := 4 ;
                          Dec(EquilibrioQuadre) ;
                        end ;
             else
                  ExitWithError ;
             end ;
         4 : case C of
                  ']' : Dec(EquilibrioQuadre) ;
                  '[' : begin
                          Stato := 2 ;
                          Inc(EquilibrioQuadre) ;
                        end ;
                  '(' : begin
                          Stato := 1 ;
                          Inc(EquilibrioTonde) ;
                        end ;
                  ')' : begin
                          Stato := 3 ;
                          Dec(EquilibrioTonde) ;
                        end ;
             else
                  ExitWithError ;
             end ;
    end ;
  end ;
  if ( EquilibrioQuadre <> 0 ) or ( EquilibrioTonde <> 0 ) then
    ExitWithError
  else
    WriteLn( 'SI ) ;
end.
--
Andrea Laforgia (ICQ 87230455)
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

 ha scritto nel messaggio
news:20010325185358.SIDL15928.fep48-svc.tin.it@[212.48.4.52]...


Ma non esiste un modo più breve per risolvere questo tipo di problema ??
Sto anch'io cercando di risolverlo e la soluzione dovrebbe essere una
procedura intorno alle 20-30 righe !!
--
Byez
Richi
Visita il mio sito 
http://spazioweb.inwind.it/richiair/home.htm

 ha scritto nel messaggio
news:uvosQCA...@cwnts22.ciaoweb...


 Ma non esiste un modo piů breve per risolvere questo tipo di problema ??


 ha scritto nel messaggio
news:8jWz6.22616$wG3.1...@news.infostrada.it...


 {(7+5)*[(14-6)/(6+7) ]+5}
Siccome sicuramente conosci i caratteri che ci possono essere puoi creare
una costante e cancellare ordinatamente i simboli fino a che non ti
riconduci alle parentesi e ...


{(7+5)*[(14-6)/(6+7) ]+5}
Non e' un caso di input valido.
La stringa deve contenere solo parentesi, da quanto ho capito.
In ogni caso, si puo' ignorare benissimo tutto cio' che non lo sia.