环形队列为啥从尾进,头出?,不是先进先出吗?
#define MAX_SIZE 12 //缓冲区大小
typedef struct
{
unsigned char head; //缓冲区头部位置
unsigned char tail; //缓冲区尾部位置
unsigned char ringBuf[MAX_SIZE]; //缓冲区数组
} ringBuffer_t;
ringBuffer_t buffer; //定义一个结构体
定义一个结构头体则表示新的消息队列已经创建完成。新建创建的队列,头指针head和尾指针tail都是指向数组的元素0
这个头和尾变量默认是0?
这样有两个好处,可以检测环形队列内是否还有数据,是否已经满。
因为两个指针都只是向后移动,如果头指针移动到尾指针,则表明环形表已经空啦(出完了)
如果尾指针移动到头指针,则表明环形表已经满啦。
初始化时头和尾指针都是0,填充数据时,尾指针向后移动,取出数据时头指针移动,它们的移动规律都是
C1=(C0+Len)%MAX_SIZE一般都是一个一个的存入数据,即Len=1,其中C0是当前指针位置,C1是移动后位置。
说是0也不完全准确
循环队列为空的判断条件是头指针的数=尾指针的数,为慢就尾指针+1=头指针
但初始建立的时候就是0.
环形队列一般会有两个指针的,一个指示当前出队列的位置,一个指示入队列的位置,然后这两个指针都是到了最后的位置又从头继续开始,所以才叫做环形
像你这里给出的这种定义方式,那个缓冲区头部位置变量应该就是用来指示当前入队列的位置,缓冲区尾部变量用来指示出队列的位置,这样就能指示当前存在数据的头尾