program ET;
const MAXTAM         = 70;
      CANCELACARATER = '#';
      CANCELALINHA   = '\';
      SALTALINHA     = '*';
      MARCAEOF       = '~';
type TipoChave     = char;
     TipoApontador = integer;
     TipoItem      = record
                       Chave: TipoChave;
                       { outros componentes }
                     end;
     TipoPilha     = record
                       Item: array [1..MAXTAM] of TipoItem;
                       Topo: TipoApontador;
                     end;
var
  Pilha: TipoPilha;
  x    : TipoItem;

procedure FPVazia (var Pilha: TipoPilha);
begin
  Pilha.Topo := 0;
end; { FPVazia }

function Vazia (Pilha: TipoPilha): boolean;
begin
  Vazia := Pilha.Topo = 0;
end; { Vazia }

procedure Empilha (x: TipoItem; var Pilha: TipoPilha);
begin
  if Pilha.Topo = MAXTAM
  then writeln ('Erro: pilha esta cheia')
  else begin
       Pilha.Topo := Pilha.Topo + 1;
       Pilha.Item[Pilha.Topo] := x;
       end;
end; { Empilha }

procedure Desempilha (var Pilha: TipoPilha; var Item: TipoItem);
begin
  if Vazia (Pilha)
  then writeln ('Erro: pilha esta vazia')
  else begin
       Item := Pilha.Item[Pilha.Topo];
       Pilha.Topo := Pilha.Topo - 1;
       end;
end; { Desempilha }
function Tamanho (Pilha: TipoPilha): integer;
begin
  Tamanho := Pilha.Topo;
end; { Tamanho }

procedure Imprime (var Pilha: TipoPilha);
var Pilhaux: TipoPilha; x: TipoItem;
begin
  FPVazia (Pilhaux);
  while not Vazia (Pilha) do
    begin Desempilha (Pilha, x); Empilha (x, Pilhaux); end;
  while not Vazia (Pilhaux) do
    begin Desempilha (Pilhaux, x); write (x.Chave); end;
  writeln;
end; { Imprime }

begin {---Programa principal---}
  FPVazia (Pilha); read (x.Chave);
  while x.Chave <> MARCAEOF do
    begin
    if x.Chave = CANCELACARATER
    then begin
         if not Vazia (Pilha)
         then Desempilha (Pilha, x);
         end
    else if x.Chave = CANCELALINHA
         then FPVazia (Pilha)
         else if x.Chave = SALTALINHA
              then Imprime (Pilha)
              else begin
                   if Tamanho (Pilha) = MAXTAM then Imprime (Pilha);
                   Empilha (x, Pilha);
                   end;
    read (x.Chave);
    end;
  if not Vazia (Pilha) then Imprime (Pilha);
end. {---Programa principal---}

