有关循环队列

来源:互联网 发布:java得到当前项目路径 编辑:程序博客网 时间:2024/06/10 05:10
将队列的首尾相连构成一个环形区域,当在第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从头到尾都是有数据的。