预留空间环形队列使用总结

规则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