Nous allons redéfinir le type pile comme un tableau de pointeurs sur des tableaux (figure 6.5).
Figure 6.5: Un tableau de pointeurs sur des tableaux de taille
fixe
program tabdyn;
const taille=4;
n=10;
type base = integer;
tab=array[1..taille] of base;
ptab=^tab;
tdyn=array[0..n-1] of ptab;
pile = record espace : tdyn;
index : integer;
end;
var pairs, impairs : pile;
x : integer;
procedure initpile(var p:pile);
var i : integer;
begin
p.index:=0;
end;
function pilevide(p:pile):boolean;
begin
pilevide:=(p.index=0);
end;
procedure empiler(var p:pile; e:base);
var nmax : integer;
begin
nmax:=n*taille;
if (p.index=nmax) then writeln('empilement impossible')
else if ((p.index mod taille)=0) then
begin
new(p.espace[(p.index div taille)]);
p.espace[(p.index div taille)]^[1]:=e;
p.index:=p.index+1;
end
else
begin
p.espace[(p.index div taille)]^[(p.index mod taille)+1]:=e;
p.index:=p.index+1;
end;
end;
procedure depiler(var p:pile; var e:base);
begin
if pilevide(p) then writeln('impossible de depiler')
else if ((p.index mod taille)=1) then
begin
e:=p.espace[(p.index div taille)]^[1];
dispose(p.espace[(p.index div taille)]);
p.index:=p.index-1;
end
else begin
e:=p.espace[((p.index-1) div taille)]^[((p.index-1) mod taille)+1];
p.index:=p.index-1;
end;
end;
begin
initpile(pairs);
initpile(impairs);
writeln('Entrez des nombres entiers, pour arreter entrez 0');
readln(x);
while (x<>0) do
begin
if (x mod 2 = 0) then empiler(pairs,x)
else empiler(impairs,x);
readln(x);
end;
writeln('Les nombres pairs que vous avez entres sont ');
while not(pilevide(pairs)) do
begin
depiler(pairs, x);
writeln(x);
end;
writeln('Les nombres impairs que vous avez entres sont ');
while not(pilevide(impairs)) do
begin
depiler(impairs, x);
writeln(x);
end;
end.