首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

环形队列实现原理(3)

环形队列实现原理(3)

三.预留空间环境队列

-------------------------------------------------------------------

不采用tag,只留一个空间
  

初始化状态: q->head = q->tail = q->tag = 0;
队列为空q->head == q->tail)
队列为满: (((q->tail+1)%q->size) == q->head )
入队操作:如队列不满,则写入
     q->tail =  (q->tail + 1) % q->size ;
出队操作:如果队列不空,则从head处读出。
    下一个可读的位置在 q->head =  (q->head + 1) % q->size

头文件
  ringq.h
   
[cpp] view plain copy
print?
    #ifndef __RINGQ_H__  
    #define __RINGQ_H__  
      
    #ifdef __cplusplus  
    extern "C" {  
    #endif   
      
    #define RINGQ_MAX 20  
      
    typedef struct ringq{  
       int head; /* 头部,出队列方向*/  
       int tail; /* 尾部,入队列方向*/   
       int size ; /* 队列总尺寸 */  
       int space[RINGQ_MAX]; /* 队列空间 */  
    }RINGQ;  
      
    /*
      取消tag .限制读与写之间至少要留一个空间
      队列空 head == tail .
      队列满是 (tail+1)%MAX == head   
      初始化是head = tail = 0;   
    */  
      
    extern int ringq_init(RINGQ * p_ringq);  
      
    extern int ringq_free(RINGQ * p_ringq);  
      
    extern int ringq_push(RINGQ * p_ringq,int data);  
      
    extern int ringq_poll(RINGQ * p_ringq,int * p_data);  
      
    #define ringq_is_empty(q) (q->head == q->tail)  
      
    #define ringq_is_full(q) (((q->tail+1)%q->size) == q->head )  
      
    #define print_ringq2(q,d) printf("ring head %d,tail %d,data %d\n", q->head,q->tail,d);  
      
    #ifdef __cplusplus  
    }  
    #endif   
      
    #endif /* __QUEUE_H__ */  

实现代码ringq.c
[cpp] view plain copy
print?
    #include <stdio.h>  
      
    #include "ringq.h"  
      
    int ringq_init(RINGQ * p_ringq)  
    {  
      p_ringq->size = RINGQ_MAX;  
        
      p_ringq->head = 0;  
      p_ringq->tail = 0;  
        
      return p_ringq->size;  
    }  
      
    int ringq_free(RINGQ * p_ringq)  
    {  
      return 0;  
    }  
      
    /* 往队列加入数据 */  
    int ringq_push(RINGQ * p_ringq,int data)  
    {  
       print_ringq(p_ringq,data);  
         
       if(ringq_is_full(p_ringq))  
         {  
             printf("ringq is full,data %d\n",data);  
               return -1;  
         }  
               
       p_ringq->space[p_ringq->tail] = data;  
         
       p_ringq->tail = (p_ringq->tail + 1) % p_ringq->size ;     
         
        return p_ringq->tail ;  
    }  
      
      
    int ringq_poll(RINGQ * p_ringq,int * p_data)  
    {  
       print_ringq(p_ringq,-1);  
      if(ringq_is_empty(p_ringq))  
       {  
         printf("ringq is empty\n");  
         return -1;  
       }  
         
       *p_data = p_ringq->space[p_ringq->head];  
         
       p_ringq->head = (p_ringq->head + 1) % p_ringq->size ;  
         
       return p_ringq->head;  
    }
继承事业,薪火相传
返回列表