循环队列

顺序队列图示:
循环队列_第1张图片
由于顺序的非环状的队列不能很好地判断队列是否为满,造成假溢出的现象,因此引入循环队列很好地解决了这一问题
循环队列图示:
循环队列_第2张图片

1.循环队列牺牲一个存储空间来区分队满和队空(牺牲一个存储空间只是其中一种解决方案),最大存储空间为 Maxsize-1;
2.队满条件: (q->rear+1)%Maxsize ==q->front
3.对空条件:q->front==q->rear
4.队中元素的个数: num=(q->rear-q->front+Maxsize)%Maxsize;

源代码如下:
SqQueue.h

//顺序存储队列 


#define Maxsize 6
#define Elemtype int 

typedef struct{
    Elemtype data[Maxsize];  //数据域 
    Elemtype front,rear;  //头尾指针 
}Queue;


//函数声明 
Queue InitQueue();   //队列初始化 
void printQueue(Queue *q);  //打印队列 
void EnQueue(Queue *q,Elemtype e);  //入队操作
Elemtype DeQueue(Queue *q);  //出队操作 

SqQueue.c

//队列的顺序存储

 #include "SqQueue.h" 
 #include <stdio.h>
 #include<stdlib.h>


  int main()
  {
    int n=1;
        Queue  q;
        q=InitQueue();
        printQueue(&q);

         while(n!=0)
    {
         printf("\t\t/////////////////////////\n");
         printf("\t\tinput your choice \n");
         printf("\t\t1.En Queue \n");
         printf("\t\t2.De Queue \n");
         printf("\t\t/////////////////////////\n");
         scanf("%d",&n);
        switch(n)
        {
            int m,p;
            case 1: printf("1.input the elem you want to push\n");
                    scanf("%d",&m);
               EnQueue(&q,m); 
                printQueue(&q);
                break;
            case 2: p=DeQueue(&q);
                printf(" 元素 %d 出队列! \n",p);
                printQueue(&q);
                break;
            default:
                break;
        }
    }

    return 0;
  }


  Queue InitQueue()  //队列初始化 
  {
    Queue  q ;
    int n,m,i;
    q.front=0;
    q.rear=0;

    printf("input the numble of elem you want to add\n"); 
    scanf("%d",&n);
    printf("input the elem \n"); 
    for(i=0;i<n;i++)
    {
        scanf("%d",&m); 
        q.data[i]=m;
        q.rear++;  
        printf("队尾指针:%d\n",q.rear);
     }
     return q;
  }

  void EnQueue(Queue *q,Elemtype e)//入队操作
  {
    //判断队满
      if((q->rear+1)%Maxsize ==q->front) 
      {
        printf("the queue is full!\n"); 
    }else{
        q->data[q->rear]=e;
        q->rear=(q->rear+1)%Maxsize;  //队尾指针进一 
            printf("队尾指针:%d\n",q->rear);
      }
  } 

  Elemtype DeQueue(Queue *q)  //出队操作 
  {
    //判断队空
    int head;
      if(q->front==q->rear)
      {
            printf("the queue is empty!\n"); 
            return NULL;
    } else{
        head=q->front;
        q->front=(q->front+1)%Maxsize;  //队首元素进一 
        return q->data[head];
        }
  }
  void printQueue(Queue *q) //打印队列 
  {
    int i,num,n;
    printf("print the Queue!\n");

  /* for( i=q->front;i<q->rear;i++) //传统的遍历法,行不通 { printf("%d ",q->data[i]); // } */

        //打印得到元素的个数 ,传统的遍历行不通
         num=(q->rear-q->front+Maxsize)%Maxsize;
         for(i=q->front,n=0;n<num;n++,i=(i+1)%Maxsize) 
         {
                printf("%d ",q->data[i]);
        }
     printf("\n"); 
     printf("此时的队首指针:%d\n",q->front);
     printf("此时的队尾指针:%d\n",q->rear);
     printf("\n"); 
  } 

//其他队列常见的基本操作如判断队空队满,读队头元素等包含在上面的代码中,没有单独写成函数了

你可能感兴趣的:(循环队列)