Situazione
Data una espressione algebrica che contiene parentesi tonde,innestate tra loro a qualsiasi livello, si vuole controllare la correttezza della parentesizzazione:
-per ogni parentesi aperta eiste una parentesi chiusa, che le corrisponde; e viceversa.
Problema
Proponete una strategia risolutiva e descrivetela in linguaggio di progetto.
UNA SOLUZIONE AL PROBLEMA PROPOSTO
Raffinamento 1
(* le parentesi aperte vengono memorizzate in una "STRUTTURA" che le accatasta.
In essa sono possibili due operazioni:
IMPILA-sovrappone l'ultimo dato ricevuto ai precedenti;
ESTRAI-restituite l'ultimo dato ricevuto e lo cancella *)
PROGRAMMA parentesi
VAR....
RIPETI
ACQUISISCI un dato
SE è una parentesi
ALLORA SE è aperta
ALLORA IMPILA
ALTRIMENTI
BEGIN
ESTRAI
controlla la correttezza
END
FINCHE' non ricevi il segnale di fine lavoro
END.
Ed ecco il programma
program PARENTESI;
Type PUNTA^=nodo;
nodo=RECORD
inf:CHAR;
Q:PUNTA
end;
Var p0,p,r:PUNTA;
n,i:INTEGER;
ch:CHAR;
begin
{ costruzione della lista }
p0:=nil;
repeat read(ch); case ch of
'(':begin {impila /PUSH}
new(p); p^.inf:=ch; p^.q:=p0; p0:=p
end;
')':if p0<>nil then begin { estrai/POP}
p:=p0; p0:=p^.q; dispose(p)
end
else exit
end; { case }
writeln; { stampa impilata della lista via via generata }
r:=p0;
while r<>nil do begin
write(r^.inf);
r:=r'.q
end; until ch=chr(13); {
writeln;
if p0=nil then write ('OK') else write ('KO?');
end.
Nessun commento:
Posta un commento