text: /* File : queue.h */
  /* Definisi ADT Queue dengan representasi array secara eksplisit dan alokasi dinamik */
  /* Model Implementasi Versi III dengan circular buffer */
  
  #ifndef queue_H
  #define queue_H
  
  #include "../Boolean/boolean.h"
  
  #define NilQ 0
  /* Konstanta untuk mendefinisikan address tak terdefinisi */
  
  /* Definisi elemen dan address */
  typedef char infotype;
  typedef int addressQ;   /* indeks tabel */
  /* Contoh deklarasi variabel bertype Queue : */
  /* Versi I : tabel dinamik, Head dan Tail eksplisit, ukuran disimpan */
  typedef struct { infotype * T;   /* tabel penyimpan elemen */
                   addressQ HEAD;  /* alamat penghapusan */
                   addressQ TAIL;  /* alamat penambahan */
                   int MaxElQ;     /* Max elemen queue */
                 } Queue;
  /* Definisi Queue kosong: HEAD=NilQ; TAIL=NilQ. */
  /* Catatan implementasi: T[0] tidak pernah dipakai */
  
  /* ********* AKSES (Selektor) ********* */
  /* Jika Q adalah Queue, maka akses elemen : */
  #define Head(Q) (Q).HEAD
  #define Tail(Q) (Q).TAIL
  #define InfoHead(Q) (Q).T[(Q).HEAD]
  #define InfoTail(Q) (Q).T[(Q).TAIL]
  #define MaxElQ(Q) (Q).MaxElQ
  
  /* ********* Prototype ********* */
  boolean IsEmptyQ (Queue Q);
  /* Mengirim true jika Q kosong: lihat definisi di atas */
  int NBElmtQ (Queue Q);
  /* Mengirimkan banyaknya elemen queue. Mengirimkan 0 jika Q kosong */
  
  /* *** Kreator *** */
  void CreateEmptyQ (Queue * Q, int Max);
  /* I.S. sembarang */
  /* F.S. Sebuah Q kosong terbentuk dan salah satu kondisi sbb: */
  /* Jika alokasi berhasil, Tabel memori dialokasi berukuran Max+1 */
  /* atau : jika alokasi gagal, Q kosong dg MaxElQ=0 */
  /* Proses : Melakukan alokasi,Membuat sebuah Q kosong */
  
  /* *** Destruktor *** */
  void DeAlokasiQ(Queue * Q);
  /* Proses: Mengembalikan memori Q */
  /* I.S. Q pernah dialokasi */
  /* F.S. Q menjadi tidak terdefinisi lagi, MaxElQ(Q) diset 0 */
  
  /* *** Primitif Add/Delete *** */
  void AddQ (Queue * Q, infotype X);
  /* Proses: Menambahkan X pada Q dengan aturan FIFO */
  /* I.S. Q mungkin kosong, tabel penampung elemen Q TIDAK penuh */
  /* F.S. X menjadi TAIL yang baru, TAIL "maju" */
  /* F.S. X menjadi TAIL yang baru, TAIL "maju" dengan mekanisme circular buffer */
  void DelQ(Queue * Q, infotype * X);
  /* Proses: Menghapus X pada Q dengan aturan FIFO */
  /* I.S. Q tidak mungkin kosong */
  /* F.S. X = NilQai elemen HEAD pd I.S., HEAD "maju" dengan mekanisme circular buffer; Q mungkin kosong */
  
  #endif
  