天天看點

環形隊列的實作

頭檔案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;
}
           

繼續閱讀