1. 程式人生 > >迴圈佇列的儲存結構

迴圈佇列的儲存結構

 CylSeqQuene.h檔案

/**************************************
   檔案位置:3 棧和佇列\CylSeqQuene
   檔名稱及型別:CylSeqQuene.h
   實現功能:迴圈佇列的儲存結構 
***************************************/

#include"..\..\1 緒論\StartDefine\StartDefine.h"

#define MAXQSIZE 100 //最大佇列長度

typedef int QElemType;//迴圈佇列型別定義 
typedef struct{
	QElemType *base;//初始化的動態分配儲存空間
	int front;//頭指標,若佇列不空,指向佇列頭元素
	int rear;//尾指標,若佇列不空,指向佇列尾元素的下一個位置 
}SqQueue;

//構造一個空佇列
Status InitQueue(SqQueue &Q);

//佇列Q被摧毀,不再存在
void DestroyQueue(SqQueue &Q);

//將Q清為空佇列
Status ClearQueue(SqQueue &Q);

//判斷佇列是否為空,是的話返回TRUE,否則返回FALSE
Status QueueEmpty(SqQueue Q);

//返回佇列的元素個數,即佇列長度
int QueueLength(SqQueue Q);

//用e返回Q的隊頭元素
Status GetHead(SqQueue Q,QElemType &e);
 
 //插入元素e為新的隊尾元素
Status EnQueue(SqQueue &Q,QElemType e);

//刪除Q的隊頭元素,並用e返回其值 
Status DeQueue(SqQueue &Q,QElemType &e);

//從隊頭到隊尾,依次對Q中的資料元素呼叫函式visit(),一旦visit()失敗,則操作失敗 
void QueueTraverse(SqQueue Q,void(*visit)(QElemType)); 

 CylSeqQuene.cpp檔案

/**************************************
   檔案位置:3 棧和佇列\CylSeqQuene
   檔名稱及型別:CylSeqQuene.cpp 
   實現功能:迴圈佇列的儲存結構的實現 
***************************************/

#include"CylSeqQueue.h"

//構造一個空佇列
Status InitQueue(SqQueue &Q){
	Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
	if(!Q.base) exit(OVERFLOW);//儲存分配失敗
	Q.front=Q.rear=0;
	return OK;
} 

//佇列Q被摧毀,不再存在
void DestroyQueue(SqQueue &Q){
	if(Q.base)
	free(Q.base);
	
	Q.base=NULL;
	Q.front=Q.rear=0;
}

//將Q清為空佇列
Status ClearQueue(SqQueue &Q){
	Q.front=Q.rear=0;
}

//判斷佇列是否為空,是的話返回TRUE,否則返回FALSE
Status QueueEmpty(SqQueue Q){
	if(Q.front==Q.rear)
	return TRUE;
	else
	return ERROR;
}

//返回佇列的元素個數,即佇列長度
int QueueLength(SqQueue Q){
	return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}

//用e返回Q的隊頭元素
Status GetHead(SqQueue Q,QElemType &e){
	if(Q.front==Q.rear)
	return ERROR;
	e=Q.base[Q.front];
	return OK;
}
 
 //插入元素e為新的隊尾元素
Status EnQueue(SqQueue &Q,QElemType e){
	if((Q.rear+1)%MAXQSIZE==Q.front)//隊滿 
	return ERROR;
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXQSIZE;
	return OK;
}

//刪除Q的隊頭元素,並用e返回其值 
Status DeQueue(SqQueue &Q,QElemType &e){
	if(Q.front==Q.rear)//判空 
	return ERROR;
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAXQSIZE;
	return OK; 
}

//從隊頭到隊尾,依次對Q中的資料元素呼叫函式visit(),一旦visit()失敗,則操作失敗 
void QueueTraverse(SqQueue Q,void(*visit)(QElemType)){
	int i=Q.front;
	while(i!=Q.rear){
		visit(Q.base[i]);
		i=(i+1)%MAXQSIZE;
	}
}

CylSeqQuene-Test.cpp檔案

/**************************************
   檔案位置:3 棧和佇列\CylSeqQuene
   檔名稱及型別:CylSeqQuene-Test.cpp 
   實現功能:迴圈佇列的儲存結構的測試 
***************************************/

#include"CylSeqQueue.cpp"

int main(){
	SqQueue Q;
	int i;
	QElemType e;
	void PrintElem(QElemType e);
	
	printf("函式InitQueue測試...\n");
	printf("初始化迴圈佇列...");
	InitQueue(Q);
	printf("\n");
	
	printf("函式QueueEmpty測試...\n");
	QueueEmpty(Q)?printf("迴圈佇列為空\n"):printf("迴圈佇列不為空");
	
	printf("函式EnQueue測試...\n");
	for(int i=1;i<=6;i++){
		printf("將%d插入到佇列Q...",2*i);
		EnQueue(Q,2*i);
		printf("累計插入%d個元素\n",(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE);
	}
	printf("\n");
	
	printf("函式QueueTraverse測試...\n");
	QueueTraverse(Q,PrintElem);
	printf("\n");
	
	printf("函式QueueLength測試...\n");
	printf("佇列中元素的個數為%d\n",QueueLength(Q));
	
	printf("函式DeQueue測試...\n");
	DeQueue(Q,e);
	printf("刪除的元素為%d\n",e);
	GetHead(Q,e);
	printf("此時佇列頭的元素為%d\n",e); 
	
	printf("函式ClearQueue測試...\n");
	ClearQueue(Q);
	QueueEmpty(Q)?printf("迴圈佇列為空\n"):printf("迴圈佇列不為空");
	
	printf("函式DestroyQueue測試...\n");
	DestroyQueue(Q);
	Q.base==NULL?printf("迴圈佇列已不存在\n"):printf("迴圈佇列還存在");
}

//定義輸出函式
void PrintElem(QElemType e){
	printf("%d ",e);
}