头文件dequeue.h存放函数声明,声明结构体
#ifndef _DEQUEUE_H
#define _DEQUEUE_H
#include <stdio.h>
#include <stdlib.h>
#define QUEUENUM 5
typedef int DataType;
typedef struct{
DataType _data[QUEUENUM];
DataType* _head;
DataType* _tail;
size_t _size;
}Dequeue;
//初始化函数
void dequeueInit(Dequeue* qu);
//销毁函数
void dequeueDestroy(Dequeue* qu);
//在队列中插入数据,相当于单向链表的尾插
int dequeuePush(Dequeue* qu, DataType x);
//相当于单向链表的头删
void dequeuePop(Dequeue* qu);
//返回队列头的数据
DataType dequeueFront(Dequeue* qu);
//返回队列尾的数据
DataType dequeueBack(Dequeue* qu);
//判断队列中的数据是否为空
int dequeueIsEmpty(Dequeue* qu);
//返回队列中数据个数
size_t dequeueSize(Dequeue* qu);
#endif
源文件dequeue.c用来存放函数功能的实现
#include "dequeue.h"
//初始化函数
void dequeueInit(Dequeue* qu){
qu->_head = qu->_tail = qu->_data;
qu->_size = 0;
}
//销毁,释放函数
void dequeueDestroy(Dequeue* qu){
qu->_head = qu->_tail = qu->_data;
qu->_size = 0;
}
//在队列中插入数据,相当于单向链表的尾插
int dequeuePush(Dequeue* qu, DataType x){
*qu->_tail = x;
if (qu->_tail + 1 == qu->_head ||
(qu->_tail + 1 - qu->_data == QUEUENUM && qu->_head == qu->_data)){
return -1;
}
qu->_tail++;
if (qu->_tail - qu->_data == QUEUENUM){
qu->_tail = qu->_head;
}
qu->_size++;
return 0;
}
//相当于单向链表的头删
void dequeuePop(Dequeue* qu){
qu->_head++;
if (qu->_head - qu->_data == QUEUENUM){
qu->_head = qu->_data;
}
qu->_size--;
}
//返回队列头的数据
DataType dequeueFront(Dequeue* qu){
return *qu->_head;
}
//返回队列尾的数据
DataType dequeueBack(Dequeue* qu){
if (qu->_tail == qu->_data){
return qu->_data[QUEUENUM - 1];
}
return qu->_tail[-1];
}
//判断队列中的数据是否为空
int dequeueIsEmpty(Dequeue* qu){
return qu->_head == qu->_tail;
}
//返回队列中数据个数
size_t dequeueSize(Dequeue* qu){
return qu->_size;
}
源文件main.c进行代码测试
#include "dequeue.h"
int main(){
Dequeue qu;
dequeueInit(&qu);
printf("%d\n", dequeuePush(&qu, 1));//尾插
printf("%d\n", dequeuePush(&qu, 2));//尾插
printf("%d\n", dequeuePush(&qu, 3));//尾插
printf("%d\n", dequeuePush(&qu, 4));//尾插
printf("%d\n", dequeuePush(&qu, 5));//尾插(超过容量QUEUENUM),插入失败
printf("%d\n", dequeueSize(&qu));//查看size大小
printf("%d\n", dequeueBack(&qu));//查看队列尾数字
printf("%d\n", dequeueFront(&qu));//查看队列头数字
dequeuePop(&qu);//头删
printf("%d\n", dequeueFront(&qu));//打印看是否头删成功
printf("%d\n", dequeueSize(&qu));//看size是否发生变化
printf("%d\n", dequeueIsEmpty(&qu));//判断是否为空,0表示非空,1表示空
dequeueDestroy(&qu);
system("pause");
return 0;
}