cadenapq.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION

  Determinar si una cadena $z$ es de la forma $z = x C y$, 
  donde $y$ es la cadena inversa de $x$. Se usan los
  TAD-PILA y TAD-COLA de caracteres por punteros.
  keywords: pila, cola

  FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{$ Id: cadenapq.pas 2002/04/11 11:10  jdelia  Exp jdelia   $}
program p_cadenapq ;
uses
  u_pilapc, u_colapc ;
const
  nulo      = ''  ;
  blanco    = ' ' ;
  separador = 'C' ;

type
  pila = pilapc ;
  cola = colapc ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ERROR (s: string);
begin
  write ('error: ') ;
  writeln (s);
  halt ;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function ES_CADENAPQ (s: string): boolean ;
var
  b	  : boolean ;
  j, k, n : integer ;
  P	  : pila ;
  C	  : cola ;
  x, y	  : char ;
begin
  ES_CADENAPQ := false ;
  k := 0 ;
  n := length (s);
  for j := 1 to n do begin
    if  ( s [j] = separador ) then begin
      k := j ;
      break
    end ; {if}
  end ; {j}
  if ( k = 0 ) then exit ;
  P.ANULA ;
  j := 1 ;
  while ( j <= k ) do begin
    x := s [j];
    b := (x <> blanco) and (x <> nulo) and (x <> separador);
    if (b) then begin write (x) ; P.METE (x) end ;
    j := j + 1 ; 
  end ; {while}
  writeln ;

  C.ANULA ;
  j := k + 1 ;
  while ( j <= n ) do begin
    y := s [j];
    b := (y <> blanco) and (y <> nulo) and (y <> separador);
    if (b) then begin write (y) ; C.PONE (y) end ;
    j := j + 1 ; 
  end ; {while}
  writeln ;
  writeln ;
  while not (P.VACIA) do begin
    x := P.TOPE   ;
    y := C.FRENTE ;
    P.SACA;
    C.QUITA;
    writeln ('caracter extraido en la pila = ', x);
    writeln ('caracter extraido en la cola = ', y);
    if (x <> y) then begin writeln ; exit end ;
  end ; {while}
  writeln ;
  ES_CADENAPQ := true ;  
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
  s : string;
begin
  writeln;
  write ('string: ');
  readln (s) ;
  if ( ES_CADENAPQ (s) ) then
    writeln ('SI es de la forma x C y, donde y = inv (x) ')
  else begin
    writeln ('NO es de la forma x C y, donde y = inv (x) ')
  end ; {if}
  writeln
end.  
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.