对模拟环形队列的回顾

43 篇文章 1 订阅

头文件 deque.h

#ifndef _DEQUE_H
#define _DEQUE_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;
}deque;

//初始化函数
void dequeInit(deque* qu);

//清空队列的函数
void dequeEmpty(deque* qu);

//在队列中插入数据(尾插)
int dequePush(deque* qu, DataType x);

//删除队列中的数据(头删)
int dequePop(deque* qu);

//返回队首的数据
DataType dequeFront(deque* qu);

//返回队尾的数据
DataType dequeBack(deque* qu);

//队列的size大小
size_t dequeSize(deque* qu);

//判断队列是否为空
int dequeIsEmpty(deque* qu);

#endif //_DEQUE_H

源文件 deque.c

#include "deque.h"

//初始化函数
void dequeInit(deque* qu){
	qu->_head = qu->_tail = qu->_data;
	qu->size = 0;
}

//清空队列的函数
void dequeEmpty(deque* qu){
	qu->_head = qu->_tail;
	qu->size = 0;
}

//在队列中插入数据(尾插)
int dequePush(deque* 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->_data;	//此处构造一个环形队列
	}
	qu->size++;
	return 0;
}

//删除队列中的数据(头删)
int dequePop(deque* qu){
	if (dequeIsEmpty(qu)){
		return 0;
	}
	qu->_head++;
	if (qu->_head - qu->_data == QUEUENUM){
		qu->_head = qu->_data;	//此处也是为了构造环形队列
	}
	qu->size--;
	return 0;
}

//返回队首的数据
DataType dequeFront(deque* qu){
	return *qu->_head;
}

//返回队尾的数据
DataType dequeBack(deque* qu){
	if (qu->_tail == qu->_data){
		return qu->_data[QUEUENUM - 1];
	}
	return qu->_tail[-1];
}

//队列的size大小
size_t dequeSize(deque* qu){
	return qu->size;
}

//判断队列是否为空
int dequeIsEmpty(deque* qu){
	return qu->_head == qu->_tail;
}

测试 源文件 main.c

#include "deque.h"

int main(){
	deque test;
	dequeInit(&test);
	dequePush(&test, 1);
	dequePush(&test, 2);
	dequePush(&test, 3);
	printf("%d\n", dequeFront(&test));
	dequePop(&test);
	printf("%d\n", dequeFront(&test));
	dequePop(&test);
	printf("%d\n", dequeFront(&test));
	dequePush(&test, 4);
	dequePush(&test, 5);
	dequePop(&test);
	printf("%d\n", dequeFront(&test));
	dequePush(&test, 6);
	dequePush(&test, 7);
	dequePop(&test);
	printf("%d\n", dequeFront(&test));
	dequePop(&test);
	printf("%d\n", dequeFront(&test));
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值