eue(QUEUE *);//判断循环队列是否已满
bool del_queue(QUEUE *,int *);//出队
bool empty_queue(QUEUE *);//判断循环队列是否为空
bool traverse_queue(QUEUE *);//遍历输出
int length(QUEUE *);//求循环队列的长度
int main()
{
QUEUE Q;
int val;
init(&Q);
en_queue(&Q,1);
en_queue(&Q,2);
en_queue(&Q,3);
en_queue(&Q,4);
traverse_queue(&Q);
if(del_queue(&Q,&val))
printf("出队成功,出队元素的值为:%d\n",val);
else
printf("出队失败!");
traverse_queue(&Q);
printf("队列的长度为:%d\n",length(&Q));
return 0;
}
void init(QUEUE *pQ)
{
pQ->pBase=(int *)malloc(sizeof(int)*5);//造数组,设其数组长度为n=5(规定当数组中有n-1个元素时已满),初始化时使Queue的成员front、rear的值都为0
if(NULL==pQ->pBase)
{
printf("动态内存分配失败!\n");
exit(-1);
}
pQ->front=0;
pQ->rear=0;
}
bool full_queue(QUEUE *pQ)
{
if((pQ->rear+1)%5==pQ->front)
return true;
else
return false;
}
bool en_queue(QUEUE *pQ,int val)
{
if(full_queue(pQ))
{
printf("队列已满,入队失败!\n");
return false;
}
pQ->pBase[pQ->rear]=val;
pQ->rear=(pQ->rear+1)%5;//队尾加1
return true;
}
bool del_queue(QUEUE *pQ,int *pVal)
{
if(empty_queue(pQ))
return false;
*pVal=pQ->pBase[pQ->front];
pQ->front=(pQ->front+1)%5;
return true;
}
bool empty_queue(QUEUE *pQ)
{
if(pQ->rear==pQ->front)//因为队列不为空时,rear和front肯定不相等
return true;
else
return false;
}
bool traverse_queue(QUEUE *pQ)
{
int i=pQ->front;
if(empty_queue(pQ))
{
printf("队列为空,遍历失败!\n");
return false;
}
printf("队列元素有:");
while(i!=pQ->rear)
{
printf("%d ",pQ->pBase[i]);
i=(i+1)%5;
}
printf("\n");
return true;
}
int length(QUEUE *pQ)
{
int len=0;
int i=pQ->front;;
if(empty_queue(pQ))
return 0;//队列为空,长度为0
while(i!=pQ->rear)
{
i=(i+1)%5;
++len;
}
return len;
}
注意
1.指针只在入队和出队时移动,其它情况下不能移动。
2.队列初始化:front和rear的值都是零;
3.队列非空:front代表的是队列的第一个元素,rear代表的是队列的最后一个有效元素的下一个元素。
4.顺序队列和循环队列最直观的区别就是:循环队列首尾相连形成一个圆环,而顺序队列不成环状(通常会造成内存资源的浪费)。
5.队列的应用非常广泛,所有与时间有关的操作都可以用到队列。