/* queue.h */#ifndef _QUEUE_H#define _QUEUE_Hstruct queue_record;typedef struct queue_record *queue;int is_empty( queue q );int is_full( queue q );queue create_queue( int max_elements );void dispose_queue( queue q );void make_empty( queue q );void enqueue( int x, queue q );int front( queue q );void dequeue( queue q );int front_and_dequeue( queue q );#endif
/* queue.c */#include "queue.h"#include#include #define MIN_QUEUE_SIZE 5struct queue_record{ int capacity; int front; int rear; int size; int *array;};voidmake_empty( queue q ){ q->size = 0; q->front = 1; q->rear = 0;}intis_empty( queue q ){ return q->size == 0;}int is_full( queue q ){ return q->size == q->capacity;}queuecreate_queue( int max_elements ){ queue q; if( max_elements < MIN_QUEUE_SIZE ) { printf("Queue size is too small!\n"); exit(0); } q = malloc( sizeof(struct queue_record) ); if(q == NULL) { printf("Out of space!\n"); exit(1); } q->array = malloc(sizeof(int) * max_elements); if(q->array == NULL) { printf("Out of space!\n"); exit(1); } q->capacity = max_elements; make_empty(q); return q;}static intsucc( int value, queue q ){ if( ++value == q->capacity ) value = 0; return value;}voidenqueue( int x, queue q ){ if( is_full( q ) ) { printf("full queue!\n"); exit(0); } else { q->size++; q->rear = succ( q->rear, q ); q->array[q->rear] = x; }}void dequeue( queue q ){ if( is_empty( q ) ) { printf("empty queue!\n"); exit(0); } else { q->size--; q->front = succ( q->front, q ); }}intfront( queue q ){ if( is_empty( q ) ) { printf("empty queue!\n"); exit(0); } else return q->array[q->front];}intfront_and_dequeue( queue q ){ int tmp; if( is_empty( q ) ) { printf("empty queue!\n"); exit(0); } else { tmp = q->array[q->front]; q->size--; q->front = succ( q->front, q ); return tmp; }}void dispose_queue( queue q ){ if( q != NULL ) { free(q->array); free(q); }}
/* queue_test.c */#include "queue.h"#includeintmain(void){ queue q; int tmp; int i; q = create_queue(10); printf("1 enqueue\n"); enqueue(1, q); printf("2 enqueue\n"); enqueue(2, q); printf("3 enqueue\n"); enqueue(3, q); printf("4 enqueue\n"); enqueue(4, q); printf("5 enqueue\n"); enqueue(5, q); printf("\n"); for(i=0; i<5; i++) { printf("dequeue %d\n", front_and_dequeue( q )); } }
测试结果: