tpu/u_prique.pas

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

  Colas de prioridad por monticulos. keywords: cola de prioridad

FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: u_prique.pas 2002/05/21 21:33 mstorti Exp mstorti $  }

unit u_prique ;

interface

const
   tam_max = 1000;
	     
type
   tipo_elemento = integer;

COLA_DE_PRORIDAD = object
   private	    
   contenido : array [1..tam_max] of tipo_elemento;
   ult: integer;
   public
   procedure ANULA;
   procedure INSERTA (x : tipo_elemento);
   function  SUPRIME_MIN : tipo_elemento;
   procedure IMPRIME (s : string) ;
   function  VACIA : boolean;
end;			     
   
procedure ERROR (s : string);

implementation

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

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure COLA_DE_PRORIDAD.ANULA;
begin
  ult := 0;
end; { COLA_DE_PRORIDAD.ANULA }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function COLA_DE_PRORIDAD.VACIA : boolean;
begin
  VACIA := ult=0;
end; { COLA_DE_PRORIDAD.VACIA }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure COLA_DE_PRORIDAD.INSERTA (x : tipo_elemento);
var
  i    : integer;
  temp : tipo_elemento;
begin
  if ult >= tam_max then begin
     ERROR ('La cola de prioridad esta llena...')
  end ; {if}
  ult := ult+1;
  contenido [ult] := x;
  i := ult;
  while (i>1) and (contenido[i] < contenido[i div 2]) do begin
    {sube `x' en el arbol y lo intercambia}
    temp := contenido [i];  {con su padre de mayor prioridad }
    contenido [i] := contenido [i div 2];
    contenido [i div 2] := temp;
    i := i div 2;
  end;
end; { COLA_DE_PRORIDAD.INSERTA }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure COLA_DE_PRORIDAD.IMPRIME (s: string);
var
  i : integer;
begin
  write (s,' ');
  for i:=1 to ult do write (contenido [i],' ');
  writeln;
end; { COLA_DE_PRORIDAD.IMPRIME }
      
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function COLA_DE_PRORIDAD.SUPRIME_MIN : tipo_elemento;
var
  i, j : integer;
  temp : tipo_elemento;
begin 
  if VACIA then ERROR ('La cola de prioridad esta vacia.');
  SUPRIME_MIN := contenido [1];
  contenido [1] := contenido [ult]; { Sube ultimo elemento }
  ult := ult - 1;		      { actualiza cursor }
  i   := 1;
  while i<= ult div 2 do begin
    {Lleva el elemento hacia abajo en el arbol }
    if   (contenido [2*i] < contenido [2*i + 1])
      or (ult = 2*i) then
      j:=2*i
    else begin
      j := 2*i +1
    end ; {if}
    if (contenido [i] > contenido [j]) then
       begin
       temp := contenido [i];
       contenido [i] := contenido[j];
       contenido [j] := temp;
       i := j;
       end
    else begin
       break
    end ; {if}
 end ; {while}
end; { COLA_DE_PRORIDAD.SUPRIME_MIN }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.