环形队列的实现

头文件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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值