program FilaArranjo;
 
const MAXTAM = 1000;
type
  TipoChave     = integer;
  TipoApontador = integer;
  TipoItem      = record
                    Chave: TipoChave;
                    { outros componentes }
                  end;
  TipoFila      = record 
                    Item  : array [1..MAXTAM] of TipoItem;
                    Frente: TipoApontador;
                    Tras  : TipoApontador;
                  end;

procedure FFVazia (var Fila: TipoFila);
begin
  Fila.Frente := 1;
  Fila.Tras := Fila.Frente;
end; { FFVazia }

function Vazia (Fila: TipoFila): boolean;
begin
  Vazia := Fila.Frente = Fila.Tras;
end; { Vazia }

procedure Enfileira (x: TipoItem; var Fila: TipoFila);
begin
  if Fila.Tras mod MAXTAM + 1 = Fila.Frente
  then writeln ('Erro: fila esta  cheia')
  else begin
       Fila.Item[Fila.Tras] := x;
       Fila.Tras := Fila.Tras mod MAXTAM + 1;
       end;
end; { Enfileira }

procedure Desenfileira (var Fila: TipoFila; var Item: TipoItem);
begin
  if Vazia (Fila)
  then writeln ('Erro: fila esta vazia')
  else begin
       Item := Fila.Item[Fila.Frente];
       Fila.Frente := Fila.Frente mod MAXTAM + 1;
       end;
end; { Desenfileira }

var
  Fila : TipoFila;
  item : TipoItem;
  Vetor: array [1..MAXTAM] of integer;
  i, j, k, n, Max: integer;

begin
  Max := 10;
  FFVazia (Fila);

  { 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;

  { Enfileira cada chave }
  for i := 1 to Max do
    begin
    item.Chave := Vetor[i];
    Enfileira (item, Fila);
    writeln ('Enfileirou: ', item.Chave);
    end;
  
  { Desenfileira cada chave }
  for i := 1 to Max do
    begin
    Desenfileira (Fila, item);
    writeln ('Desenfileirou: ', item.Chave);
    end;
end. { FilaArranjo }

