program PilhaArranjo;

const MAXTAM = 1000;
type
  TipoChave     = integer;
  TipoApontador = integer;
  TipoItem      = record
                    Chave: TipoChave;
                    { outros componentes }
                  end;
  TipoPilha     = record
                    Item: array [1..MAXTAM] of TipoItem;
                    Topo: TipoApontador;
                  end;

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 }
 
var
  pilha: TipoPilha;
  item : TipoItem;
  vetor: array [1..MAXTAM] of integer;
  i, j, k, n, max: integer;

begin
  max := 10;
  FPVazia(pilha);

  { Gera uma permutação aleatoria de chaves entre 1 e max }
  randomize;
  for i := 1 to max do vetor[i] := i;
  for i := 1 to max do
    begin
    k := 1 + random(max);
    j := 1 + random(max);
    n := vetor[k];
    vetor[k] := vetor[j];
    vetor[j] := n;
    end;

  { Empilha cada chave }
  for i := 1 to max do
    begin
    item.Chave := vetor[i];
    Empilha(item, pilha);
    writeln('Empilhou: ', item.Chave);
    end;
  
  writeln('Tamanho da pilha: ', Tamanho(Pilha));
  
  { Desempilha cada chave }
  for i := 1 to max do
    begin
    Desempilha(pilha, item);
    writeln('Desempilhou: ', item.Chave);
    end;
  
  writeln('Tamanho da pilha: ', Tamanho(Pilha));
end. { PilhaArranjo }

