循环队列的实现

来源:互联网 发布:js 控制重新打开页面 编辑:程序博客网 时间:2024/06/05 01:07

/*循环队列.cpp-----------循环队列的实现*/

/*

         队列:一种实现“先进先出”的数据存储结构。链式队列同链表类似,而静态队列主要以循环列表的形式出现。

         如果不进行循环队列的实现,将浪费很多内存空间。

         循环队列有两个参数:front rear 分别指向队首和队尾。插入的时候从队尾插入rear+1;删除的时候从队首删除front+1

         循环队列初始化函数 init_Queue(pQueue pQ),首尾指向数组的0下标

                            入队函数 en_Queue(pQueue pQ,int value)检查是否已满

                            出队函数 De_Queue(pQueue pQ,int *pValue)检查是否为空

                            遍历函数 traverse_Queue(pQueue pQ);

 

         注意:由于frontrear的大小关系不确定,因此需要用取模的方式进行下一个元素指向。

                            front=(front+1)%size,rear=(rear+1)%size 其实就是为了防止队尾指向和队头指向在最后一个元素插入或者删除的时候

                            出现指向错误,而进行取模,其他情况不会出现指向出错。

                            队列满的情况判断:队列中一种两个参数,肯定是这两个数决定满与空,

                            空:front=rear;这个很容易理解

                            满:对着删除和插入的进行,很可能在某一时间frontrear进行重合,因此无法很好的判断是空还是满。

                                     这里队列中通常用n-1个数组进行存储,空出一个元素来进行比较。很容易理解。

                                     rear+1=rear就是满。防止过了很多轮删除、插入的情况同样需要模运算(rear+1)%size==rear

                            长度的求法同样有趣:(rear-front+size)%size

 

*/

#include <stdio.h>

 

#define LEN 6 

typedef struct Queue

{

         int data[LEN];

         int front;//指向队头下标

         int rear;//指向队尾下标

}Queue,*pQueue;

 

void init_Queue(pQueue pQ);//初始化队列

bool en_Queue(pQueue pQ,int value);//入队

bool de_Queue(pQueue pQ,int *pValue);//出队

void traverse_Queue(pQueue pQ);//遍历队列

bool is_empty(pQueue pQ);

bool is_full(pQueue pQ);

int main(void)

{

         Queue Q;

         int value;

 

         init_Queue(&Q);

         if( de_Queue(&Q,&value) )

         {

                   printf("删除成功,删除的元素是:%d\n",value);

         }

         traverse_Queue(&Q);

 

         if( en_Queue(&Q,1) )

         {

                   printf("插入成功\n");

         }

         if( en_Queue(&Q,2) )

         {

         printf("插入成功\n");

         }

         if( en_Queue(&Q,3) )

         {

                   printf("插入成功\n");

         }

         if( en_Queue(&Q,4) )

         {

                   printf("插入成功\n");

         }

         if( en_Queue(&Q,5) )

         {

         printf("插入成功\n");

         }

         if( en_Queue(&Q,6) )

         {

                   printf("插入成功\n");

         }

         traverse_Queue(&Q);

         if( de_Queue(&Q,&value) )

         {

                   printf("删除成功,删除的元素是:%d\n",value);

         }

         if( de_Queue(&Q,&value) )

         {

                   printf("删除成功,删除的元素是:%d\n",value);

         }

         traverse_Queue(&Q);

 

         return 0;

}

void init_Queue(pQueue pQ)

{

         pQ->rear=pQ->front=0;//初始化指向0

}

bool en_Queue(pQueue pQ,int value)

{

         //如果满了就不插了

         if( is_full(pQ) )

         {

                   printf("满了不插入了\n");

                   return false;

         }

         else

         {

                   pQ->data[pQ->rear]=value;

                   pQ->rear=(pQ->rear+1)%LEN;

                   return true;

         }

}

bool is_full(pQueue pQ)

{

         //frontrear的关系是:(rear+1)%size==front的时候满。也就是再追加元素就跟队头了就满了。

         if((pQ->rear+1)%LEN==pQ->front)

         {

                   return true;

         }

         else

         {

                   return false;

         }

}

bool de_Queue(pQueue pQ,int *pVal)

{

         //空队列的时候不再删除,不空:把删除的元素提出来,队头加一

         if( is_empty(pQ) )

         {

                   printf("空队列不再删除\n");

                   return false;

         }

         else

         {

                   *pVal=pQ->data[pQ->front];

                   pQ->front=(pQ->front+1)%LEN;

                  

                   return true;

         }

}

bool is_empty(pQueue pQ)

{

         if(pQ->front==pQ->rear)

         {

                   return true;

         }

         else

         {

                   return false;

         }

}

void traverse_Queue(pQueue pQ)

{

         //从队头开始找到队尾进行遍历

         if( is_empty(pQ) )

         {

                   printf("空表不进行遍历\n");

         }

         else

         {

                   int i=pQ->front;

 

                   while(i!=pQ->rear)

                   {

                            printf("%d ",pQ->data[i]);

                            i=(i+1)%LEN;

                   }

                   printf("\n");

         }

         return;

}

0 0
原创粉丝点击