1. 程式人生 > >資料結構---順序儲存的迴圈佇列

資料結構---順序儲存的迴圈佇列

佇列的定義

佇列是隻允許在一端進行插入操作,在另一端進行刪除操作的線性表,允許插入(也稱入隊,進隊)的一端叫隊尾,允許刪除(也叫出隊)的一端叫做對頭,佇列具有先進先出的特點。

在順序佇列中,隨著佇列的插入刪除操作,整個佇列向陣列中下標較大的位置移動,從而產生佇列的單向移動性。當元素被插入到陣列中下標最大的位置時,陣列的空間就用完了,儘管此時陣列的低端還有空閒空間,這種現象叫假溢位。 為了解決這種假溢位,可以將儲存佇列的陣列看做成頭尾相接的迴圈結構,即循序佇列。

順序儲存的迴圈佇列

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

//定義陣列的最大長度
#define QueueSize 100

//定義佇列元素的資料型別,為int
typedef int DataType;

typedef struct {
	
	DataType data[QueueSize];
	int front;
	int rear;
	
}CirQueue;
 
 
//迴圈佇列的初始化
void InitQueue(CirQueue ** Q){
	
	(*Q)->front = (*Q)->rear = QueueSize-1;
	
}

//迴圈佇列的銷燬:迴圈佇列是靜態儲存分配,
//在迴圈佇列變數退出作用域自動釋放所佔記憶體單元,順序儲存的迴圈佇列無需銷燬


//入隊操作
int EnQueue(CirQueue ** Q , DataType x){

	if(((*Q)->rear + 1)%QueueSize == (*Q)->front){
		printf("上溢錯誤,入隊失敗");
		return 0;
	}
	//隊尾位置在迴圈意義上加1
	(*Q)->rear = ((*Q)->rear + 1) % QueueSize;
	//在隊尾插入元素
	(*Q)->data[(*Q)->rear] = x;
	
	return 1;

}


//出隊操作

int DeQueue(CirQueue ** Q,DataType * ptr){
	
	if((*Q)->rear == (*Q)->front){
		
		printf("下溢錯誤,刪除失敗");
		return 0;
	}
	(*Q)->front = ((*Q)->front + 1)%QueueSize;
	*ptr = (*Q)->data[(*Q)->front];
	return 1;
	
}

int GetHead(CirQueue * Q,DataType * ptr){
	
	int i;
	if(Q->rear == Q->front){
		printf("下溢錯誤,取隊頭失敗");
		
	}
	i = (Q->front + 1)%QueueSize;
	*ptr = Q->data[i];
	return 1;
	
}

int Empty(CirQueue * Q)
{
	if(Q->rear == Q->front){
		return 1;
	}else{
		return 0;
	}
}

int main(){
	
	DataType x;
	CirQueue * Q;
	InitQueue(&Q);
	
	EnQueue(&Q,5);
	EnQueue(&Q,4);
	EnQueue(&Q,3);
	EnQueue(&Q,2);
	EnQueue(&Q,1);
	
	if(GetHead(Q,&x) == 1)
		printf("當前隊頭元素為:%d\n",x);
	
	if(DeQueue(&Q,&x) == 1)
		printf("執行一次出隊操作,出隊元素為%d\n",x);
	
	if(GetHead(Q,&x) == 1)
		printf("當前隊頭元素為:%d\n",x);
	
	
	if(DeQueue(&Q,&x) == 1)
		printf("執行一次出隊操作,出隊元素為%d\n",x);
	
	if(GetHead(Q,&x) == 1)
		printf("當前隊頭元素為:%d\n",x);
	
	if(Empty(Q) == 1){
		printf("佇列為空\n");
		
	}else{
		
		printf("佇列非空\n");
	}
	
	
	return 0;
}


![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181028165935250.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2N6eGxqeTk5OQ==,size_27,color_FFFFFF,t_70)