parentesis.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Control de par\'entesis en una expresi\'on algebraica
usando TAD-PILA de caracteres por punteros. Por
``parentizaci\'on'' en una expresi\'on algebraica
consideramos los simbolos: par\'entisis, corchetes y
llaves.
La cadena leida (caracter a caracter) puede contener otros
simbolos. Pero, para el control, prestamos atenci\'on
s\'olo a los caracteres de parentizaci\'on, de los cuales:
a) si el simbolo leido es ``abierto'', entonces se lo
almacena a la espera de encontrar un ``cerrado'';
b) si el simbolo leido es ``cerrado'', entonces se
determina si el ULTIMO simbolo ``abierto'' almacenado
es del mismo tipo. Si lo son, entonces ambos parentizan
correctamente, no hace falta considerarlos ulteriormente,
y se prosigue evaluando el resto de la cadena. Si no lo
son, entonces, la cadena estar\'a mal parentizada.
En consecuencia, el TAD a usar sera tal que ``el \'ultimo en
entrar, es el primero en salir'', o sea, una PILA.
keywords: pila
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ Nota: Este ejercicio, alternativamente, se podria hacer
sin el uso de una pila, pero es un preliminar al programa
de evaluacion de expresiones algebraicas. }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: parentisis.pas 2002/04/09 10:30 jdelia Exp jdelia $}
program parentesis ;
uses
u_pilapc ;
type
pila = pilapc ;
const
sale = '#' ;
pizq = '(' ; pder = ')' ;
cizq = '[' ; cder = ']' ;
lizq = '{' ; lder = '}' ;
var
p : pila ;
ch1, ch2 : tipo_elemento ;
abre, cierra : set of char ;
balancea : boolean ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function CONTROL (ch1, ch2: tipo_elemento): boolean ;
var
bal_par, bal_cor, bal_lla, bal_gen : boolean ;
begin
bal_par := ( ch2 = pizq ) and ( ch1 = pder ) ; {parentesis}
bal_cor := ( ch2 = cizq ) and ( ch1 = cder ) ; {corchetes}
bal_lla := ( ch2 = lizq ) and ( ch1 = lder ) ; {llaves}
CONTROL := bal_par or bal_cor or bal_lla ;
writeln (' caracter_2 caracter_1 = ', ch2, ch1);
writeln (' balance actual = ', CONTROL);
end ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
begin {parentesis}
abre := [ pizq, cizq, lizq ] ;
cierra := [ pder, cder, lder ] ;
writeln ;
write (' ingrese de un caracter por registro');
writeln (' (# para salir):');
read (ch1);
P.ANULA ;
balancea := true ;
while ( ch1 <> sale ) and (balancea) do begin
if (ch1 in abre ) then
P.METE (ch1)
else if (ch1 in cierra ) then begin
if (P.VACIA) then
balancea := false
else begin
ch2 := P.TOPE;
balancea := CONTROL (ch1, ch2) ;
P.SACA ;
end ; {if}
end ; {if}
read (ch1);
end ; {while}
writeln ;
if not (P.VACIA) or not (balancea) then
writeln (' la expresion esta mal parentizada ')
else begin
writeln (' la expresion esta bien parentizada ')
end ; {if}
writeln ;
end . {parentesis}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.