循环队列

来源:互联网 发布:计字器软件 编辑:程序博客网 时间:2024/06/16 21:33

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

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");   } 

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

0 0
原创粉丝点击