環形隊列2-基於隊頭指針和隊列中元素的個數的另一種實現

        基於隊頭指針和隊列中的元素個數實現環形隊列

        對於環形隊列來說,如果知道隊頭指針和隊列中元素個數,則可以計算出隊尾指針。也就是說,可以用隊列中元素個數代替隊尾指針。

由隊頭指針和元素個數進行如下計算

已知front、rear,求隊中元素個數:

   count=(rear-front+MaxSize)%MaxSize

已知front、count,求rear:

   rear=(front+rear)%MaxSize

已知rear、count,求front:

   front=(rear-count+MaxSize)%MaxSize

 

環形隊列的基本操作:

  • 隊空條件:count=0
  • 隊滿條件:count=MaxSize
  • 進隊e操作:rear=(rear+1)%MaxSize; 將e放在rear處
  • 出隊操作:front=(front+1)%MaxSize;取出front處元素e;
這樣的環形隊列中最多可放置MaxSize個元素。
 
具體實現過程如下:
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef int ElemType;
typedef struct
{
	ElemType data[MaxSize];
	int front;			//隊頭指針
	int count;			//隊列中元素個數
} QuType;
void InitQueue(QuType *&qu)						//初始化隊運算算法
{	qu=(QuType *)malloc(sizeof(QuType));
	qu->front=0;
	qu->count=0;
}
void DestroyQueue(QuType *&qu)
{
	free(qu);
}
bool EnQueue(QuType *&qu,ElemType x)			//進隊運算算法
{	int rear;									//臨時隊尾指針
	if (qu->count==MaxSize)						//隊滿上溢出
		return false;
	else
	{	rear=(qu->front+qu->count)%MaxSize;	//求隊尾位置
		rear=(rear+1)%MaxSize;					//隊尾循環增1
		qu->data[rear]=x;
		qu->count++;							//元素個數增1
		return true;
	}
}
bool DeQueue(QuType *&qu,ElemType &x)			//出隊運算算法
{	if (qu->count==0)							//隊空下溢出
		return false;
	else
	{	qu->front=(qu->front+1)%MaxSize;		//隊頭循環增1
		x=qu->data[qu->front];
		qu->count--;							//元素個數減1
		return true;
	}
}
bool QueueEmpty(QuType *qu)						//判隊空運算算法
{
	return(qu->count==0);
}
void main()
{
	QuType *q;
	ElemType e;
	InitQueue(q);
	EnQueue(q,1);
	EnQueue(q,2);
	EnQueue(q,3);
	EnQueue(q,4);
	printf("出隊順序:");
	while (!QueueEmpty(q))
	{
		DeQueue(q,e);
		printf("%d ",e);
	}
	printf("\n");
	DestroyQueue(q);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章