c3-1.c
/* code: c3-1.c   (v1.18.00) */
#include<stdio.h>
#include<stdlib.h>
#define MAX 128
#define ENQUEUE_SUCCESS     1
#define ENQUEUE_FAILURE    -1
#define DEQUEUE_SUCCESS     2
#define DEQUEUE_FAILURE    -2
/* ------------------------------------------- */
void queue_init (int *front, int *rear) {
  *front = -1;
  *rear = -1;
}
/* ------------------------------------------- */
int enqueue (int q[], int *rear, int data) {
  if (*rear < MAX - 1) {
    *rear = *rear + 1;
    q[*rear] = data;
    return ENQUEUE_SUCCESS;
  }
  else {
    return ENQUEUE_FAILURE;
  }
}
/* ------------------------------------------- */
int dequeue (int q[], int *front, int rear, int *data) {
  if (*front == rear) {
    return DEQUEUE_FAILURE;
  }
  *front = *front + 1;
  *data = q[*front];
  return DEQUEUE_SUCCESS;
}
/* ------------------------------------------- */
int main () {
  int queue[MAX];
  int front, rear, data;
  int stat;
  queue_init (&front, &rear);
  enqueue (queue, &rear, 100);
  enqueue (queue, &rear, 200);
  enqueue (queue, &rear, 300);
  enqueue (queue, &rear, 400);
  enqueue (queue, &rear, 500);
  while (rear - front) {
    stat = dequeue (queue, &front, rear, &data);
    if (stat == DEQUEUE_SUCCESS) {
      printf ("%d\n", data);
    }
    else {
      printf ("QUEUE is empty\n");
    }
  }
  return 0;
}
q3-1.c
/* code: q3-1.c   (v1.18.00) */
#include<stdio.h>
#include<stdlib.h>
#define MAX 128
#define ENQUEUE_SUCCESS     1
#define ENQUEUE_FAILURE    -1
#define DEQUEUE_SUCCESS     2
#define DEQUEUE_FAILURE    -2
/* ------------------------------------------- */
void queue_init (int *front, int *rear) {
  *front = -1;
  *rear = -1;
}
/* ------------------------------------------- */
int enqueue (int q[], int *rear, int data) {
  if (*rear < MAX - 1) {
    *rear = *rear + 1;
    q[*rear] = data;
    return ENQUEUE_SUCCESS;
  }
  else {
    return ENQUEUE_FAILURE;
  }
}
/* ------------------------------------------- */
int dequeue (int q[], int *front, int rear, int *data) {
  if (*front == rear) {
    return DEQUEUE_FAILURE;
  }
  *front = *front + 1;
  *data = q[*front];
  return DEQUEUE_SUCCESS;
}
/* ------------------------------------------- */
void queue_display (int q[], int front, int rear) {
  int i;
  if (front == rear) {
    printf ("QUEUE empty!");
  }
  printf ("[ ");
  for (i = front + 1; i <= rear; i++) {
    printf ("%d ", q[i]);
  }
  printf ("]\n");
}
/* ------------------------------------------- */
int main () {
  int queue[MAX];
  int front, rear, data;
  int stat;
  queue_init (&front, &rear);
  enqueue (queue, &rear, 100);
  enqueue (queue, &rear, 200);
  enqueue (queue, &rear, 300);
  enqueue (queue, &rear, 400);
  enqueue (queue, &rear, 500);
  queue_display (queue, front, rear);
  while (rear - front) {
    stat = dequeue (queue, &front, rear, &data);
    if (stat == DEQUEUE_SUCCESS) {
      printf ("%d\n", data);
    }
    else {
      printf ("QUEUE is empty\n");
    }
  }
  return 0;
}
q3-2.c
/* code: q3-2.c   (v1.18.00) */
#include<stdio.h>
#include<stdlib.h>
#define MAX 128
#define ENQUEUE_SUCCESS     1
#define ENQUEUE_FAILURE    -1
#define DEQUEUE_SUCCESS     2
#define DEQUEUE_FAILURE    -2
#define PEEK_SUCCESS     3
#define PEEK_FAILURE    -3
/* ------------------------------------------- */
void queue_init (int *front, int *rear) {
  *front = -1;
  *rear = -1;
}
/* ------------------------------------------- */
int enqueue (int q[], int *rear, int data) {
  if (*rear < MAX - 1) {
    *rear = *rear + 1;
    q[*rear] = data;
    return ENQUEUE_SUCCESS;
  }
  else {
    return ENQUEUE_FAILURE;
  }
}
/* ------------------------------------------- */
int dequeue (int q[], int *front, int rear, int *data) {
  if (*front == rear) {
    return DEQUEUE_FAILURE;
  }
  *front = *front + 1;
  *data = q[*front];
  return DEQUEUE_SUCCESS;
}
/* ------------------------------------------- */
int peek_front (int q[], int front, int rear, int *data) {
  if (front == rear) {
    return PEEK_FAILURE;
  }
  *data = q[front + 1];
  return PEEK_SUCCESS;
}
/* ------------------------------------------- */
int main () {
  int queue[MAX];
  int front, rear, data, i;
  int d[] = { 680, 670, 690, 650, 660 };
  queue_init (&front, &rear);
  data = 0;
  for (i = 0; i < 5; i++) {
    printf ("enqueue: %d\n", d[i]);
    enqueue (queue, &rear, d[i]);
  }
  printf ("\n");
  for (i = 0; i < 3; i++) {
    dequeue (queue, &front, rear, &data);
    printf ("dequeue: %d\n", data);
  }
  printf ("\n");
  peek_front (queue, front, rear, &data);
  printf ("peek_front: %d\n", data);
  return 0;
}
q3-3.c
/* code: q3-3.c   (v1.18.00) */
#include<stdio.h>
#include<stdlib.h>
#define DATA_SIZE    100000000
#define MAX          100000000
#define ENQUEUE_SUCCESS     1
#define ENQUEUE_FAILURE    -1
#define DEQUEUE_SUCCESS     2
#define DEQUEUE_FAILURE    -2
/* ------------------------------------------- */
void queue_init (int *front, int *rear) {
  *front = -1;
  *rear = -1;
}
/* ------------------------------------------- */
int enqueue (int q[], int *rear, int data) {
  if (*rear < MAX - 1) {
    *rear = *rear + 1;
    q[*rear] = data;
    return ENQUEUE_SUCCESS;
  }
  else {
    return ENQUEUE_FAILURE;
  }
}
/* ------------------------------------------- */
int dequeue (int q[], int *front, int rear, int *data) {
  if (*front == rear) {
    return DEQUEUE_FAILURE;
  }
  *front = *front + 1;
  *data = q[*front];
  return DEQUEUE_SUCCESS;
}
/* ------------------------------------------- */
int main () {
  int *queue;
  int front, rear, data;
  int i, stat;
  queue = malloc (sizeof (int) * MAX);
  queue_init (&front, &rear);
  printf ("queue size: %d\n\n", DATA_SIZE);
  printf ("enqueue:\n");
  for (i = 0; i < DATA_SIZE; i++) {
    data = rand () % 1000;
    if (i < 10)
      printf ("%3d ", data);
    enqueue (queue, &rear, data);
  }
  printf ("\n");
  printf ("dequeue:\n");
  while ((10 - 1) - front) {
    stat = dequeue (queue, &front, rear, &data);
    if (stat == DEQUEUE_SUCCESS) {
      printf ("%d ", data);
    }
    else {
      printf ("QUEUE is empty\n");
    }
  }
  printf ("\n");
  free (queue);
  return 0;
}
q3-4.c
/* code: q3-4.c   (v1.18.00) */
#include<stdio.h>
#include<stdlib.h>
#define MAX 128			/* ring buffer max size */
#define ENQUEUE_SUCCESS     1
#define ENQUEUE_FAILURE    -1
#define DEQUEUE_SUCCESS     2
#define DEQUEUE_FAILURE    -2
/* ------------------------------------------- */
void rb_queue_init (int *front, int *rear) {
  *front = 0;
  *rear = 0;
}
/* ------------------------------------------- */
int rb_enqueue (int q[], int *front, int *rear, int data) {
  int index_f, index_r, index_q;
  index_f = *front % MAX;
  index_r = (*rear + 1) % MAX;
  if (index_f != index_r) {
    index_q = (*rear)++ % MAX;
    q[index_q] = data;
    return ENQUEUE_SUCCESS;
  }
  else {
    return ENQUEUE_FAILURE;
  }
}
/* ------------------------------------------- */
int rb_dequeue (int q[], int *front, int *rear, int *data) {
  int index;
  if (*front != *rear) {
    index = (*front)++ % MAX;
    *data = q[index];
    return DEQUEUE_SUCCESS;
  }
  else {
    return DEQUEUE_FAILURE;
  }
}
/* ------------------------------------------- */
int main () {
  int queue[MAX];
  int front, rear, data;
  int stat;
  rb_queue_init (&front, &rear);
  rb_enqueue (queue, &front, &rear, 100);
  rb_enqueue (queue, &front, &rear, 200);
  rb_enqueue (queue, &front, &rear, 300);
  rb_enqueue (queue, &front, &rear, 400);
  rb_enqueue (queue, &front, &rear, 500);
  while (rear - front) {
    stat = rb_dequeue (queue, &front, &rear, &data);
    if (stat == DEQUEUE_SUCCESS) {
      printf ("%d\n", data);
    }
    else {
      printf ("QUEUE is empty\n");
    }
  }
  return 0;
}
EOF