1. 程式人生 > >迴圈佇列----佇列的順序表示和實現

迴圈佇列----佇列的順序表示和實現

1.佇列的順序表示

1)C語言的描述

初始化建空對列時,令front=rear=0,每當插入新的隊尾元素時,“尾指標增1”;每當刪除佇列頭元素時,“頭指標增1”。因此,在非空佇列中,頭指標始終指向佇列頭元素,而尾指標始終指向佇列尾元素的下一位置,如圖所示。

2)存在問題

假設當前為佇列分配的最大空間為6,則當佇列處於圖3.12(d)的狀態時不可再繼續插入新的隊尾元素,否則會因陣列越界而遭致程式程式碼被破壞。然而此時又不宜如順序棧那樣,進行儲存再分配擴大陣列空間,因為佇列的實際儲存空間未佔滿。一個巧妙的辦法是將順序佇列臆造為一個環狀空間,稱之為迴圈佇列。

2.迴圈佇列的儲存結構

#define  MAXQSIZE  100

typedef  struct

{

     QElemType     *base;

     int    front;

     int    rear;

}SqQueue;

3. 基本操作的函式原型

1)建立

Status InitQueue(SqQueue &Q);

操作結果:構造一個迴圈佇列Q

2)探空

int QueueEmpty(SqQueue Q);

操作結果:若Q為空,返回TRUE,否則返回FALSE

3)入隊

Status EnQueue(SqQueue &Q,QElemType e);

操作結果:插入元素e為新的隊尾元素

4)出隊

Status DeQueue(SqQueue &Q,QElemType &e);

操作結果:若佇列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK

                否則返回ERROR

5)獲取隊頭元素

Status GetHead(SqQueue Q,QElemType &e);

操作結果:若佇列不空,則用e返回Q的隊頭元素,並返回OK;否則返回ERROR

6)求隊長

int QueueLength(SqQueue Q);

操作結果:返回隊中元素個數

7)清空

Status ClearQueue(SqQueue &Q);

操作結果:將Q清為空佇列

8)輸出隊中全部元素

void Print(SqQueue Q);

操作結果:輸出Q中的全部元素

9)銷燬

Status DestroyQueue(SqQueue &Q);

操作結果:銷燬佇列Q,Q不再存在

4.迴圈佇列及其基本操作示意圖

5.附錄(實現程式碼)

//----*----*----*---
//程式名稱:迴圈佇列
//編譯環境:VC++ 6.0
//作者:Bee_darker
//修改日期:2018-10-25
//----*----*----*---

#define OK   1
#define OVERFLOW -1
#define ERROR 0
#define TRUE  1
#define FALSE 0
#define MAXQSIZE  100       //最大佇列長度

#include "stdio.h"
#include "stdlib.h"

typedef int	Status;
typedef int QElemType;
typedef struct
{
	QElemType  *base;       //初始化的動態分配儲存空間
	int  front;				//頭指標,若佇列不空,指向佇列頭元素
	int  rear;				//尾指標,若佇列不空,指向隊尾元素的下一位置
}SqQueue;

//建立
Status InitQueue(SqQueue &Q)
{
	Q.base = (QElemType*)malloc(MAXQSIZE * sizeof(QElemType));
	if(!Q.base)
		exit(OVERFLOW);
	Q.front = Q.rear = 0;
	return OK;
}

//判隊空
int QueueEmpty(SqQueue Q)
{
	if(Q.front == Q.rear)
		return TRUE;
	else
		return FALSE;
}
//入隊
Status EnQueue(SqQueue &Q,QElemType e)
{
	if((Q.rear+1) % MAXQSIZE == Q.front)
		return  ERROR;			//佇列滿
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MAXQSIZE;
	return OK;
}

//出隊
Status DeQueue(SqQueue &Q,QElemType &e)
{
	if(Q.front == Q.rear)
		return ERROR;		//佇列為空
	e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MAXQSIZE;
	return OK;
}

//獲取隊頭元素
Status GetHead(SqQueue Q,QElemType &e)
{
	if(Q.front  != Q.rear )
	{
		e = Q.base[Q.front];
		return OK;
	}
	return ERROR;
}

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

//清空
Status ClearQueue(SqQueue &Q)
{
	Q.front = Q.rear ;
	return OK;
}

//輸出隊中全部元素
void Print(SqQueue Q)
{
	if( Q.front == Q.rear)
		printf("Empty Queue\n");
	QElemType  x;
	printf("Q.front->");
	while(Q.front != Q.rear)
	{
		x = Q.base[Q.front];
		Q.front = (Q.front + 1) % MAXQSIZE;
		printf("%d->",x);
	}
	printf("Q.rear\n");
}

//銷燬
Status DestroyQueue(SqQueue &Q)
{
	Q.base = NULL;
	return OK;
}

int main()
{
	SqQueue  Q;
	QElemType x;
	QElemType y;
	InitQueue(Q);
	printf("QueueEmpty:%d\n",QueueEmpty(Q));
	EnQueue(Q,1);
	EnQueue(Q,2);
	EnQueue(Q,3);
	Print(Q);
	printf("GetHead:%d\n",GetHead(Q,y));
	printf("y:%d\n",y);
	DeQueue(Q,x);
	Print(Q);
	ClearQueue(Q);
	printf("QueueLength:%d\n",QueueLength(Q));
	DestroyQueue(Q);
	return 0;
}

6.測試結果