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