C语言——循环队列

循环队列

遵循先进先出(FIFO)

C语言——循环队列
浪费一个空间,让循环队列更好的判断满/空,更好运用循环队列
黑色代表空时状态,红色代表满时状态
下面代码:

#include <stdio.h>
#define M_S 20			//定义数组长度,限制元素个数
//定义结构体
struct Quene
{
        int a[M_S];
        int front;		//前指针,指向队首
        int rear;		//后指针,指向对尾
};
//初始化
void InitQuene(struct Quene *p)
{
        p->front=p->rear=0;			//初始化前后指针都指向0
}
//求长度
int QueneLength(struct Quene *p)
{
        return (p->rear-p->front+M_S)%M_S;	//求元素个数
}
//判断是否为空
short IsEmpty(struct Quene *p)
{
        if(p->front==p->rear)		//若前后指针指向同一个节点,则判断为空
                return 1;
        else
                return 0;
}
//判断是否为满
short IsFull(struct Quene *p)
{
        if(p->front==(p->rear+1)%M_S)		//若前指针等于(后指针+1)%数组大小,则判断为满
                return 1;
        else
                return 0;
}
//进队
short EnQuene(struct Quene *p,int key)
{
        if(IsFull(p))				//若队列为满,则进队失败
                return 0;
        p->a[p->rear]=key;			//否则将进队元素赋值给后指针所指的位置,后指针往后移动一格
        p->rear=(p->rear+1)%M_S;
        return 1;
}
//出队
short DeQuene(struct Quene *p,int *value)
{
        if(IsEmpty(p))				//若队列为空,则出队失败
                return 0;
        *value=p->a[p->front];			//传入一个指针保留出队元素,然后队首指向下一个元素
        p->front=(p->front+1)%M_S;
        return 1;
}
int main()
{
        struct Quene c;         //定义结构体
        InitQuene(&c);          //调用初始化函数,初始队列
        EnQuene(&c,1);       	//进队
        EnQuene(&c,2);
        EnQuene(&c,3);
        EnQuene(&c,4);
        int value;              //出队,输出
        while(DeQuene(&c,&value))
        {
                printf("---%d出队---还有%d人在队列---\n",value,QueneLength(&c));
                sleep(1);
        }
        return 0;
}

结果:
C语言——循环队列