程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 數據結構(C實現)------- 順序隊列(循環隊列之少用一個存儲空間實現) .

數據結構(C實現)------- 順序隊列(循環隊列之少用一個存儲空間實現) .

編輯:關於C語言

數據結構(C實現)------- 順序隊列(循環隊列之少用一個存儲空間實現) .


上節已經提到有三種方法來實現循環順序隊列,其中第一種設立標識不常用,最常的就是後兩種,上一節已經討論了用計數器來實現循環順序隊列,這節就用第三種方法,也就是少用一個存儲空間來實現循環順序隊列,其基本操作和用計數實現類同,下面是具體實現:

順序隊列(循環隊列)類型描述:

//順序隊列的類型描述
#define MAXSIZE 5
typedef int ElemType;
typedef struct{
	ElemType *data;
	int front,rear;
}SqQueue;

基本操作:

1. 初始化順序隊列(循環隊列) Init_SqQueue(SqQueue* Q)

void Init_SqQueue(SqQueue* Q){
    Q->data = (SqQueue*)malloc(sizeof(SqQueue) * MAXSIZE);

	Q->front = Q->rear = 0;	
}

2. 銷毀順序隊列(循環隊列)Destroy_SqQueue(SqQueue* Q)

void Destroy_SqQueue(SqQueue* Q){
	if(Q->data){
		free(Q->data);
		Q->front = Q->rear = 0;
	}
} 

3. 清空順序隊列(循環隊列)Clear_SqQueue(SqQueue* Q)

void Clear_SqQueue(SqQueue* Q){
	Q->front = Q->rear = 0;
}

4. 判斷順序隊列(循環隊列)是否為空IsEmpty_SqQueue(SqQueue* Q)

int IsEmpty_SqQueue(SqQueue* Q){
	return (Q->rear == Q->front);
}

5. 判斷順序隊列(循環隊列)是否已滿 iSFull_SqQueue(SqQueue* Q)

int iSFull_SqQueue(SqQueue* Q){
	return ((Q->rear + 1) % MAXSIZE == Q->front);
}


6. 求得順序隊列(循環隊列)的長度GetLength_SqQueue(SqQueue* Q)

int GetLength_SqQueue(SqQueue* Q){
	return (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
}

7. 取得順序隊列(循環隊列)的的隊頭GetHead_SqQueue(SqQueue* Q,ElemType *x)

void GetHead_SqQueue(SqQueue* Q,ElemType *x){
	if(IsEmpty_SqQueue(Q)){
		printf("順序隊列空!\n");
		exit(0);
	}
	else{
		*x = Q->data[Q->front];
	}
}

8. 取得順序隊列(循環隊列)的的隊尾GetRear_SqQueue(SqQueue* Q,ElemType *x

void GetRear_SqQueue(SqQueue* Q,ElemType *x){
	if(IsEmpty_SqQueue(Q)){
		printf("順序隊列空!\n");
		exit(0);
	}
	else{
		*x = Q->data[(Q->rear - 1 + MAXSIZE) % MAXSIZE];
	}
}

9. 入順序隊列(循環隊列)En_SqQueue(SqQueue* Q,ElemType x)

void En_SqQueue(SqQueue* Q,ElemType x){
	if(iSFull_SqQueue(Q)){
		printf("順序隊列已滿!\n");
		exit(0);
	}
	else{
		Q->data[Q->rear] = x;
		Q->rear = (Q->rear + 1) % MAXSIZE;
	}	
}

10. 出順序隊列(循環隊列)De_SqQueue(SqQueue* Q,ElemType *x)

void De_SqQueue(SqQueue* Q,ElemType *x){
	if(IsEmpty_SqQueue(Q)){
		printf("順序隊列空!\n");
		exit(0);
	}
	else{
		*x = Q->data[Q->front];
		Q->front = (Q->front + 1) % MAXSIZE;
	}	
}


11. 打印順序隊列(循環隊列)Print_SqQueue(SqQueue* Q)

void Print_SqQueue(SqQueue* Q){
	int i = 0;
	int j = Q->front;

	if(IsEmpty_SqQueue(Q)){
		printf("順序隊列空!\n");
		exit(0);
	}
	else{
		while(i < GetLength_SqQueue(Q)){
			printf("%d\t",Q->data[j]);
			j = (j + 1) % MAXSIZE;
			i++;
		}
		printf("\n");
	}
}


以上,就是循環順序隊列的另一種實現方法,也就是通過少用一個存儲空間,和用計數器實現循環順序隊列的主要區別在判斷隊列滿上。







  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved