基於隊頭指針和隊列中的元素個數實現環形隊列
對於環形隊列來說,如果知道隊頭指針和隊列中元素個數,則可以計算出隊尾指針。也就是說,可以用隊列中元素個數代替隊尾指針。
由隊頭指針和元素個數進行如下計算:
已知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;
#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);
}