C语言描述队列的实现及操作(数组实现)

一.静态数组实现

1.队列接口

  

#include<stdio.h>

//    一个队列模块接口
//    命名为myqueue.h

#define  QUEUE_TYPE    int    //    定义队列类型为int

//    enqueue函数
//    把一个新值插入队列末尾
void enqueue(QUEUE_TYPE value);

//    dequeue函数
//    删除队列首元素并返回
QUEUE_TYPE dequeue(void );

//    is_empty函数
//    判断队列是否为空
bool is_empty(void);

//    is_full函数
//    判断队列是否已经满
bool is_full(void);

//    front函数
//    返回队列第一个值
QUEUE_TYPE front_value(void);

//    get_size函数
//    获取队列元素个数
int get_size(void);

 

2.静态数组队列

#include<stdio.h>
#include<assert.h>
#include"myqueue.h"

const    int      QUEUE_SIZE=100;    //队列中元素个数最大限制
static    QUEUE_TYPE    queue[QUEUE_SIZE+1];    //存储队列中值的数组
static    int    front = 0;    //指向队列首元素的指针
static    int rear = 0;    //指向队列尾元素的指针

void enqueue(QUEUE_TYPE value) {
    //    判断队列是否为满
    assert(!is_full());
    //    判断队列是否为空
    if (is_empty())
        queue[front] = value;
    queue[rear] = value;
    rear = (rear + 1) % (QUEUE_SIZE + 1);

}

QUEUE_TYPE dequeue(void) {
    //判断队列是否为空
    assert(!is_empty());

    int temp = queue[front];
    front = (front + 1) % (QUEUE_SIZE + 1);
    return temp;
}

bool is_empty(void) {
    //如果rear==front则队列为空
    return rear == front;
}

bool is_full(void) {
    //如果(rear+1)%(QUEUE_SIZE+1)==front则队列为满
    return (rear + 1) % (QUEUE_SIZE + 1) == front;
}

QUEUE_TYPE front_value(void) {
    return queue[front];
}

int get_size(void) {
    return (rear-front);
}

 

二.动态数组实现

1.队列接口

#include<stdio.h>
//    在原有基础上增加了creat_queue和destroy_queue函数
#define  QUEUE_TYPE    int    //    定义队列类型为int

//    creat_queue函数
//    创建一个队列
void creat_queue(size_t size);

//    destroy_queue函数
//    销毁队列
void destroy_queue(void);

//    enqueue函数
//    把一个新值插入队列末尾
void enqueue(QUEUE_TYPE value);

//    dequeue函数
//    删除队列首元素并返回
QUEUE_TYPE dequeue(void );

//    is_empty函数
//    判断队列是否为空
bool is_empty(void);

//    is_full函数
//    判断队列是否已经满
bool is_full(void);

//    front函数
//    返回队列第一个值
QUEUE_TYPE front_value(void);

//    get_size函数
//    获取队列元素个数
int get_size(void);

 

2.动态数组队列

#include<stdio.h>
#include<assert.h>
#include<malloc.h>

static QUEUE_TYPE *queue;    //定义队列指针
static size_t queue_size;    //记录队列大小
static int  front = 0;
static int  rear = 0;


void creat_queue(size_t size) {
    assert(queue_size == 0);
    queue_size = size;
    queue =(QUEUE_TYPE*) malloc((queue_size+1)*sizeof(QUEUE_TYPE));
    assert(queue != NULL);    
}

void destroy_queue(void) {
    assert(queue_size > 0);
    queue_size = 0;
    free(queue);
    queue = NULL;
}

void enqueue(QUEUE_TYPE value) {
    //    判断队列是否为满
    assert(!is_full());
    //    判断队列是否为空
    if (is_empty())
        queue[front] = value;
    queue[rear] = value;
    rear = (rear + 1) % (queue_size + 1);
}

QUEUE_TYPE dequeue(void) {
    //判断队列是否为空
    assert(!is_empty());

    int temp = queue[front];
    front = (front + 1) % (queue_size + 1);
    return temp;
}

bool is_empty(void) {
    //如果rear==front则队列为空
    return rear == front;
}

bool is_full(void) {
    //如果(rear+1)%(QUEUE_SIZE+1)==front则队列为满
    return (rear + 1) % (queue_size + 1) == front;
}

QUEUE_TYPE front_value(void) {
    return queue[front];
}

int get_size(void) {
    return (rear - front);
}

 

posted @ 2018-04-27 19:17  !Vincent  阅读(7827)  评论(1编辑  收藏  举报