将队列的首尾相连构成一个环形区域,当在第n个位置进行元素的入队操作之后,下一个地址就“翻转”为1.采用这种方式的队列成为循环队列。
以入队为例要进行如下操作:
1.将队尾序号tail加1,即tail=tail+1
2.若tail=n+1,则tail=1;
其实以上两步可以用下面的表达式来表示:tail=(tail+1)%n.
3.若tail=head,即尾指针与头指针重合了,表示队列中元素已经装满了,则应提示溢出处理
4.若没有溢出,则将元素入队即可。
以下为求一个队列元素个数的算法:
int len(squeue *sq)
{
if(sq->front==sq->rear)
return 0;
else if(sq->rear>sq->front)
return sq->rear-sq->front;
else if(sq->rear<sq->front)
return MaxLen+sq->rear-sq->front;//这个很重要
}
谨记,在循环队列中,rear与front的关系有三种,不可以少了rear<front的这种。
void print(squeue *sq)
{
if(sq->rear==sq->front)
{
cout<<"队列为空"<<endl;
return;
}
else if(sq->rear>sq->front)
{
for(int i=sq->front;i<sq->rear;i++)
cout<<(int)sq->data[i]<<" ";
cout<<endl;
}
else if(sq->rear<sq->front)
{
for(int i=sq->front;i<sq->rear+MaxLen;i++)
cout<<(int)sq->data[(sq->rear+MaxLen)%MaxLen]<<" ";
cout<<endl;
}
}
这个算法很重要的。
写之前要弄清楚自己的队列是怎么弄的,front初始化的时候,要不要存数据,有的是不存的,有的村。我的算法中,rear是不存数据的,入队列的时候,一般都是先将rear加1,再存入数据。弄清楚这一点很重要。我的front从头到尾都是有数据的。