隊列實現循環隊列

隊列的基本操作

一、實驗目的

1.掌握隊列的順序存儲結構。

2.掌握隊列先進先出運算原則在解決實際問題中的應用。

3. 掌握自定義數據類型的用法。

二、實驗內容

仿照資料中順序循環隊列的例子,設計一個只使用隊頭指針和計數器的順序循環隊列抽象數據類型。其中操作包括:初始化、入隊列、出隊列、判斷隊列是否非空。編寫主函數,驗證所設計的順序循環隊列的正確性。

以下是隊列操作函數的定義:

(1)QueueInitiate(Q)   初始化隊列Q

(2)QueueNotEmpty(Q)   隊列Q非空否 

(3)QueueAppend(Q,x)   入隊列,在隊列Q的隊尾插入數據元素x。

(4)QueueDelete(Q,d)   出隊列,把隊列Q的隊頭元素刪除並由參數d帶回。

 提示:隊尾的位置可由隊頭指針與計數器進行求解,請思考它們之間的關係,同時還要考慮如何實現循環隊列(可藉助求模運算)。

頭文件

/*仿照資料中順序循環隊列的例子,設計一個只使用隊頭指針和計數器的順序循環隊列抽象數據類型。
其中操作包括:初始化、入隊列、出隊列、判斷隊列是否非空。編寫主函數,驗證所設計的順序循環隊列的正確性。*/
#include<stdio.h>  
#include<stdlib.h>
#include<malloc.h>
#define DateType char
#define MaxSize 10//循環隊列總數 
typedef struct{
	DateType date[MaxSize]; 
	int front;//隊頭指針 
	int counter;//計數器 
}Queue,*PQueue;


//初始化隊列Q 
PQueue QueueInitiate(){
	PQueue Q = (PQueue)malloc(sizeof(Queue));
	Q->counter = 0;
	if(Q){
		Q->counter = 0;
		Q->front = 0;
	}
	return Q;
} 
//隊列Q非空否  
int QueueNotEmpty(PQueue Q){
	//空返回1,不空返回0 
	if(Q->counter==0)	return 1;
	else	return 0;
}   
//入隊列,在隊列Q的隊尾插入數據元素x。
void QueueAppend(PQueue Q,DateType x){
	//如果隊列不存在,直接返回 
//	if(!Q){
//		return;
//	}
	//x入隊列 
	Q->date[(Q->front+Q->counter)%MaxSize] = x;
	Q->counter++;
}
//出隊列,把隊列Q的隊頭元素刪除並由參數d帶回。

void QueueDelete(PQueue Q,DateType *d){
	*d=Q->date[Q->front];
	Q->front=(Q->front+1)%MaxSize;
	Q->counter--; 
}

測試文件

#include<stdio.h>  
#include<stdlib.h>
#include<malloc.h>
#include"3.3.h"
#define DateType char
#define MaxSize 10
void main(){
	int i;
	PQueue myQ = QueueInitiate();
	DateType myC;
	DateType arr[10]={'a','b','c','d','e','f','g','h','i',};
	for(i=0;i<10;i++){
		QueueAppend(myQ,arr[i]);
	}
	printf("如果接下來輸出a-i,則正常\n");
	for(i=0;i<10;i++){
		QueueDelete(myQ,&myC);
		printf("%c\t",myC); 
	}
	//下面從隊列第10位開始輸入,測試循環性 
	for(i=0;i<10;i++){
		QueueAppend(myQ,arr[i]);
	}
	printf("\n如果接下來輸出a-i,則正常\n");	
	for(i=0;i<10;i++){
		QueueDelete(myQ,&myC);
		printf("%c\t",myC); 
	}
	//銷燬隊列
	free(myQ) ;
	myQ=NULL;
	
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章