一.静态数组实现
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);
}