package body priority_queue_pkg is
function empty(s:in p_sor) return boolean is
begin
return s.size=0;
end empty;
procedure push(s:in out p_sor;p: in priority; e:in elem) is
begin
s.elemek(s.last).adat:=e;
s.elemek(s.last).prior:=p;
emel(s,s.last);
s.last:=s.last+1;
s.size:=s.size+1;
end push;
procedure top(s:in out p_sor;p: out priority; e:out elem) is
begin
e:=s.elemek(1).adat;
p:=s.elemek(1).prior;
end top;
procedure pop(s:in out p_sor) is
begin
s.elemek(1).adat:=s.elemek(s.last-1).adat;
s.elemek(1).prior:=s.elemek(s.last-1).prior;
s.last:=s.last-1;
s.size:=s.size-1;
sully(s,1,s.last);
end pop;
function size(s:in p_sor) return natural is
begin
return s.size;
end size;
procedure emel(A:in out p_sor;i:integer) is
l:boolean:=true;
temp:sorelem;
begin
while i>1 and l loop
if A.elemek(integer(i/2)).prior<A.elemek(i).prior then
temp.prior:=A.elemek(i).prior;
temp.adat:=A.elemek(i).adat;
A.elemek(i).prior:=A.elemek(integer(i/2)).prior;
A.elemek(i).adat:=A.elemek(integer(i/2)).adat;
A.elemek(integer(i/2)).prior:=temp.prior;
A.elemek(integer(i/2)).adat:=temp.adat;
else
l:=false;
end if;
end loop;
end emel;
procedure sully(A:in out p_sor;uu:in integer;v:in integer) is
l:boolean:=true;
ir,u:integer;
temp:sorelem;
begin
u:=uu;
while (2*u<=v) and l loop
if (2*u+1>v) or else A.elemek(2*u).prior>A.elemek(2*u+1).prior then
ir:=2*u;
else
ir:=2*u+1;
end if;
if A.elemek(u).prior>=A.elemek(ir).prior then
l:=false;
else
temp.prior:=A.elemek(u).prior;
temp.adat:=A.elemek(u).adat;
A.elemek(u).prior:=A.elemek(ir).prior;
A.elemek(u).adat:=A.elemek(ir).adat;
A.elemek(ir).prior:=temp.prior;
A.elemek(ir).adat:=temp.adat;
u:=ir;
end if; end loop;
end sully;
end priority_queue_pkg;