预留空间环形队列使用总结
规则1:在队尾处(tail)存入数据
规则2:在对首处(head)取出数据。
初始化操作:q->head=0;q->tail=0;q->size=0;
空队列: q->head==q->tail ;q->size==0;
满队列: (q->tail+1)%MAX_Q_SIZE==q->head;
入队操作: q->data[q->tail]=inData; q->tail=(q->tail+1)%MAX_Q_SIZE;q->size++;
出对操作: *outData= q->data[q->head];q->head=(q->head+1)%MAX_Q_SIZE;q->size--;
头文件:
//ringQ.h
#ifndef _R_Q_H_
#define _R_Q_H_
#ifdef __cplusplus
extern "C" {
#endif
#include"stdio.h"
#define MAX_Q_SIZE (10)
struct RQ
{
int head;
int tail;
int size;
int max;
int data[10];
};
bool RQ_create(int max);
int RQ_push(struct RQ *Q,int data);
int RQ_pop(struct RQ *Q,int *val);
#define IS_EMPTY(Q) (Q->head==Q->tail)
#define IS_FULL(Q) (((Q->tail+1)%MAX_Q_SIZE)==Q->head)
#define printQ(q,d) printf("ring head %d,tail %d,data %d\n", q->head,q->tail,d)
#ifdef __cplusplus
}
#endif
#endif
实现文件:
//q.c
#include"q.h"
struct RQ RQ1;
int main(void)
{
int qData;
RQ_create(MAX_Q_SIZE);
RQ_push(&RQ1,1);
RQ_push(&RQ1,2);
RQ_push(&RQ1,3);
RQ_push(&RQ1,4);
RQ_push(&RQ1,5);
RQ_push(&RQ1,6);
RQ_push(&RQ1,7);
RQ_push(&RQ1,8);
RQ_pop(&RQ1,&qData);
RQ_pop(&RQ1,&qData);
RQ_push(&RQ1,9);
RQ_push(&RQ1,10);
RQ_push(&RQ1,11);
RQ_push(&RQ1,12);
RQ_push(&RQ1,13);
RQ_push(&RQ1,14);
}
bool RQ_create(int max)
{
RQ1.head=0;
RQ1.tail=0;
RQ1.size=0;
RQ1.max=max;
}
int RQ_push(struct RQ *Q,int data)
{
printQ(Q,data);
printf("Q->size=%d\n",Q->size);
if(IS_FULL(Q))
{
printf("Error, Q FULL\n");
return -1;
}
Q->data[Q->tail]=data;
Q->tail=(Q->tail+1)%MAX_Q_SIZE;
Q->size++;
return 0;
}
int RQ_pop(struct RQ *Q,int *val)
{
printQ(Q,-1);
printf("Q->size=%d\n",Q->size);
if(IS_EMPTY(Q))
{
printf("Error, Q empty\n");
return -1;
}
*val=Q->data[Q->head];
Q->head=(Q->head+1)%MAX_Q_SIZE;
Q->size--;
return 0;
}
实现环境:
C-free5.0
http://www.programarts.com/cfree_en/download.htm