1. 程式人生 > >資料結構(嚴蔚敏)之五——迴圈佇列(c語言實現)

資料結構(嚴蔚敏)之五——迴圈佇列(c語言實現)

在這裡我先強調幾點概念:

1、在非空佇列中,頭指標始終指向佇列頭元素,而尾指標始終指向佇列尾元素的下一個位置。

2、在單佇列中我們判斷佇列是否為空的條件是:Q.front==Q.rear;而在迴圈佇列中只憑等式Q.front==Q.rear是無法判別佇列是“空”還是“滿”;可有兩種處理方法:其一是另設一個標誌位一區別佇列是“空”還是“滿”;其二是少用一個元素空間,約定以“佇列頭指標在佇列尾指標的下一位置(置換的下一位置)上”作為佇列呈“滿”狀態的標誌,即(Q.rear+1)%MAXQSIZE == Q.front.

佇列結構的實現:

#include <stdio.h>
#include <malloc.h>
typedef int QElemType;
typedef int Status;
#define MaxQSize 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
typedef struct
{
	QElemType *base;
	int front, rear;
}SqQueue;
//初始化迴圈佇列
Status InitQueue(SqQueue &Q)
{
	Q.base = (QElemType*)malloc(MaxQSize*sizeof(QElemType));
	if (Q.base == NULL)
	{
		puts("分配記憶體空間失敗!"); 
		exit(OVERFLOW);
	}
	Q.front = Q.rear = 0;
	return 0;
}
//將迴圈佇列清空
Status ClearQueue(SqQueue &Q)
{
	Q.front = Q.rear = 0;
}
//求佇列元素的個數
Status QueueLength(SqQueue Q)
{
	return (Q.rear - Q.front + MaxQSize) % MaxQSize;
}
//插入元素到迴圈佇列
Status EnSqQueue(SqQueue &Q, QElemType e)
{
	if ((Q.rear + 1) % MaxQSize == Q.front){puts("佇列已滿!"); return ERROR; /*佇列滿*/}
	Q.base[Q.rear] = e; //元素e入隊
	Q.rear = (Q.rear + 1) % MaxQSize; //修改隊尾指標
	return OK;
}
//從迴圈佇列中刪除元素
Status DeSqQueue(SqQueue &Q, QElemType &e)
{
	if (Q.front == Q.rear)
	return ERROR;
	e = Q.base[Q.front]; //取隊頭元素至e
	Q.front = (Q.front + 1) % MaxQSize; //修改隊頭指標,如果超記憶體,迴圈 
	return OK;
}
//判斷一個迴圈佇列是否為空佇列
Status isQueueEmpty(SqQueue Q)
{
	if (Q.front == Q.rear)
	return TRUE;
	else
	return FALSE;
}
測試程式碼:
int main()
{
	int i, e;
	SqQueue Q;
	InitQueue(Q);
	for (i=0; i<MaxQSize; i++)	//只有MaxQSize個數據進佇列
		EnSqQueue(Q, i);
	i = QueueLength(Q);
	printf("佇列裡的元素有%d個\n", i);
	for (i=0; i<3; i++)
	{
		DeSqQueue(Q, e);
		printf("%d ", e);
	}
	printf("\n");
	i = QueueLength(Q);
	printf("佇列裡的元素有%d個\n", i);
	for (i=10; i<12; i++)
		EnSqQueue(Q, i);
	i = QueueLength(Q);
	printf("佇列裡的元素有%d個\n", i);
	ClearQueue(Q);
	i = QueueLength(Q);
	printf("佇列裡的元素有%d個\n", i);
	return 0;
}
執行結果: