1. 程式人生 > >資料結構與演算法學習筆記 (7)--順序佇列的實現

資料結構與演算法學習筆記 (7)--順序佇列的實現

一、背景介紹

佇列概念列是限制在兩端進行插入操作和刪除操作的線性表,允許進行存入操作的一端稱為“隊尾”,允許進行刪除操作的一端稱為“隊頭”。當線性表中沒有元素時,稱為“空隊”。

特點 :先進先出(FIFO)。

二、佇列的順序儲存結構

typedef int datatype ;	/*定義佇列中資料元素的資料型別*/
#define MAXSIZE 64		/*定義佇列的容量*/
typedef struct 
{	datatype data[MAXSIZE] ; 	/*用陣列作為佇列的儲存空間*/
	int	  front,rear ; 	/*指示隊頭位置和隊尾位置的變數*/
} sequeue ; 			/*順序佇列型別定義*/
sequeue *sq ; 		/*定義指向順序佇列的指標*/

三、相關函式實現

1.初始化佇列

void init_seqqueue(seq_pqueue *Q)
{
	*Q=(seq_pqueue)malloc(sizeof(seq_queue));
	if((*Q)==NULL)
	{
		perror("malloc");
		exit(-1);
	}
	(*Q)->front=(*Q)->rear=MAXSIZE-1;
	
	return;
}

2.判斷佇列是否滿

bool is_full_seqqueue(seq_pqueue q)
{
	if((q->rear+1)%MAXSIZE == q->front)
		return true;
	else
		return false;
}

3.判斷是否為空

bool is_empty_seqqueue(seq_pqueue q)
{
	if(q->rear == q->front)
		return true;
	else
		return false;
}

4.入隊

bool in_seqqueue(datatype data,seq_pqueue q)
{
	//判斷佇列是否滿
	if(is_full_seqqueue(q)){
		printf("佇列已滿!\n");
		return false;
	}

	//入對
	q->rear=(q->rear+1)%MAXSIZE;
	q->data[q->rear]=data;
	return true;
}

5.出隊

bool out_seqqueue(seq_pqueue q,datatype *D)
{
	//判斷佇列是否空
	if(is_empty_seqqueue(q)){
		printf("佇列已空!\n");
		return false;
	}

	//出隊
	q->front=(q->front+1)%MAXSIZE;
	*D=q->data[q->front];

	return true;
}

6.遍歷輸出

void show_seqqueue(seq_pqueue q)
{
	int i;
	if(is_empty_seqqueue(q))
		return;
	//非空時,從對頭列印到隊尾
	for(i=(q->front+1)%MAXSIZE;i!=(q->rear+1)%MAXSIZE;i=(i+1)%MAXSIZE)
	{
		printf("%d\t",q->data[i]);
	}
	printf("\n");
}