{ Terreno Antonio mat.9714216 }
unit
   coda_vet;

interface

uses
   vettori;

type
   tipo_coda=  record
                  a: tipo_array;
        fronte,retro: integer;
                  lungh: integer;
               end;

   procedure crea(var C: tipo_coda);
   function inserisci_retro(x: tipo_elemento;var C: tipo_coda): boolean;
   function estrai_fronte(var x: tipo_elemento;var C: tipo_coda): boolean;
   function piena(C: tipo_coda): boolean;
   function vuota(C: tipo_coda): boolean;
   procedure visualizza_stato(C: tipo_coda);

implementation

procedure crea(var C: tipo_coda);
{ crea coda vuota }
begin
   C.fronte:=0;
   C.retro:=0;
   C.lungh:=0
end;

function inserisci_retro(x: tipo_elemento;var C: tipo_coda): boolean;

begin
   with C do
      if piena(C) then
         begin
       writeln('owerflow error');
       inserisci_retro:= false
    end
      else
         begin
       A[retro]:=x;
       retro:= (retro+1) mod (max);
       lungh:=lungh+1;
       inserisci_retro:=true
    end
end;

function estrai_fronte(var x: tipo_elemento;var C: tipo_coda): boolean;

begin
   with C do
      if vuota(C) then
         begin
        writeln('coda vuota! ->underflow error');
        estrai_fronte:= false
    end
      else
         begin
        x:=A[fronte];
        writeln('elemento estratto -> ',x);
        fronte:=(fronte+1) mod (max);
        lungh:= lungh-1;
        estrai_fronte:= true
    end
end;

function piena(C: tipo_coda): boolean;

begin
   piena:= (C.lungh = max)
end;

function vuota(C: tipo_coda): boolean;

begin
   vuota:= (C.lungh = 0)
end;

procedure visualizza_stato(C: tipo_coda);

var
   i: integer;
begin
   if vuota(C) then
      writeln('coda vuota')
   else
      begin
         write('coda-> ');
    for i:=C.fronte to C.retro-1 do
       write(C.a[i],' ');
    writeln;
      end
end;

end.