天天看點

C語言實作順序隊列(環形)C語言實作順序隊列(環形)

C語言實作順序隊列(環形)

一、頭檔案、自定義資料類型及自定義變量

#include<stdio.h>
#include<stdlib.h>

typedef int QElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define MAXQSIZE 100	//隊列所能達到的最大長度
           

二、順序隊列的存儲結構

typedef struct{
	QElemType  data[MAXQSIZE];	
	int front;	//頭指針(數組下标)
	int rear;	//尾指針(數組下标) 
}SqQueue; 
           

三、建立隊列(初始化)

Status InitQueue(SqQueue &Q){
	Q.front=Q.rear=0;
	printf("空隊列已經建立\n");
	return OK; 	
} 
           

四、求隊列長度

int QueueLength(SqQueue Q){
	return (Q.rear+MAXQSIZE-Q.front)%MAXQSIZE; 
} 
           

解析:

隊列中有效資料個數:(rear+MAXQSIZE-front)%MAXQSIZE

因為是環形隊列,有以下兩種情況:

1、front位于rear之前

C語言實作順序隊列(環形)C語言實作順序隊列(環形)

有效資料個數:rear-front

與(rear+MAXQSIZE-front)%MAXQSIZE等價

2、front位于rear之後

C語言實作順序隊列(環形)C語言實作順序隊列(環形)

有效資料個數:rear+MAXQSIZE-front

因為rear-front<0

(rear-front)%MAXQSIZE=rear-front

與(rear+MAXQSIZE-front)%MAXQSIZE等價

五、入隊

在非空隊列中,頭指針始終指向隊列頭元素,尾指針始終指向隊列尾元素的下一個位置

入隊時,尾指針rear+1

Status EnQueue(SqQueue &Q,QElemType e){
	if((Q.rear+1)%MAXQSIZE==Q.front){	//隊滿
		printf("隊滿,無法執行此操作\n");
		return ERROR;
	}
	Q.data[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXQSIZE;	
} 
           

注意

rear+1取模含義:

當rear+1<MAXQSIZE時為原數,

大于時,把多出的補在開頭,

組止了數組越界

六、出隊

出隊時,頭指針front+1

Status DeQueue(SqQueue &Q,QElemType &e){
	if(Q.front==Q.rear){
		printf("隊列為空,無法執行此操作\n");
		return ERROR;
	}
	e=Q.data[Q.front];	//儲存隊列頭元素
	Q.front=(Q.front+1)%MAXQSIZE;
	printf("已成功入隊\n");
	printf("出隊元素:%d",e);
	return OK; 
} 
           

七、取循環隊列頭元素

QElemType GetHead(SqQueue Q){
	if(Q.front==Q.rear){
		printf("隊列中無元素,将輸出預設元素0\n");
		return ERROR; 
	}
	return Q.data[Q.front];
} 	
           

八、展示隊列

Status ShowQueue(SqQueue Q){
	int n=Q.front+(Q.rear+MAXQSIZE-Q.front)%MAXQSIZE;
	if(n==0){
		printf("隊列空,無法展示\n");
		return ERROR;
	}
	else{
		for(int i=Q.front;i<n;i++){
			printf("arr[%d]:%d\n",i%MAXQSIZE,Q.data[i%MAXQSIZE]);
		}	
		return OK;
	}
} 
           

九、主函數

int main(){
	SqQueue Q;
	int flag=0;
	int n=0;
	int l=0;
	int h=0;
	int gt=0;
	bool loop=true;
	InitQueue(Q);
	while(loop){
		printf("請操作\n");
		printf("1(Enter):入隊\n");
		printf("2(Delete):出隊\n");
		printf("3(Length):隊列目前長度\n");
		printf("4(Get):取隊首元素\n");
		printf("5(Show):展示隊列\n");
		printf("6(exit):退出程式\n");
		scanf("%d",&flag);
		switch(flag){
			case 1:
				printf("請輸入入隊元素\n");
				scanf("%d",&n);
				EnQueue(Q,n);
				printf("已成功入隊\n");
				break;
			case 2:
				DeQueue(Q,n);
				printf("已成功出隊\n");
				break;
			case 3:
				l=QueueLength(Q);
				printf("隊列目前長度為:%d\n",l);
				break;
			case 4:
				h=GetHead(Q);
				printf("隊首元素為:%d\n",h);
				break;
			case 5:
				printf("展示隊列:\n");
				ShowQueue(Q);
				break;
			case 6:
				loop=false;
				break;
		}
	}
	return 0;
} 
           

繼續閱讀