当tail赶上head,队列满,则令tag=1,
队列满: (tail+1)% MAXN ==head
- typedef struct ringq{
- int head; /* 头部,出队列方向*/
- int tail; /* 尾部,入队列方向*/
- int tag ;
- int size ; /* 队列总尺寸 */
- int space[RINGQ_MAX]; /* 队列空间 */
- }RINGQ;
出队操作:如果队列不空,则从head处读出。
- #ifndef __RINGQ_H__
- #define __RINGQ_H__
- #ifdef __cplusplus
- extern "C" {
- #endif
- #define QUEUE_MAX 20
- typedef struct ringq{
- int head; /* 头部,出队列方向*/
- int tail; /* 尾部,入队列方向*/
- int tag ; /* 为空还是为满的标志位*/
- int size ; /* 队列总尺寸 */
- int space[QUEUE_MAX]; /* 队列空间 */
- }RINGQ;
- /*
- 第一种设计方法:
- 当head == tail 时,tag = 0 为空,等于 = 1 为满。
- */
- extern int ringq_init(RINGQ * p_queue);
- extern int ringq_free(RINGQ * p_queue);
- /* 加入数据到队列 */
- extern int ringq_push(RINGQ * p_queue,int data);
- /* 从队列取数据 */
- extern int ringq_poll(RINGQ * p_queue,int *p_data);
- #define ringq_is_empty(q) ( (q->head == q->tail) && (q->tag == 0))
- #define ringq_is_full(q) ( (q->head == q->tail) && (q->tag == 1))
- #define print_ringq(q) printf("ring head %d,tail %d,tag %d\n", q->head,q->tail,q->tag);
- #ifdef __cplusplus
- }
- #endif
- #endif /* __RINGQ_H__ */
- #include <stdio.h>
- #include "ringq.h"
- int ringq_init(RINGQ * p_queue)
- {
- p_queue->size = QUEUE_MAX ;
- p_queue->head = 0;
- p_queue->tail = 0;
- p_queue->tag = 0;
- return 0;
- }
- int ringq_free(RINGQ * p_queue)
- {
- return 0;
- }
- int ringq_push(RINGQ * p_queue,int data)
- {
- print_ringq(p_queue);
- if(ringq_is_full(p_queue))
- {
- printf("ringq is full\n");
- return -1;
- }
- p_queue->space[p_queue->tail] = data;
- p_queue->tail = (p_queue->tail + 1) % p_queue->size ;
- /* 这个时候一定队列满了*/
- if(p_queue->tail == p_queue->head)
- {
- p_queue->tag = 1;
- }
- return p_queue->tag ;
- }
- int ringq_poll(RINGQ * p_queue,int * p_data)
- {
- print_ringq(p_queue);
- if(ringq_is_empty(p_queue))
- {
- printf("ringq is empty\n");
- return -1;
- }
- *p_data = p_queue->space[p_queue->head];
- p_queue->head = (p_queue->head + 1) % p_queue->size ;
- /* 这个时候一定队列空了*/
- if(p_queue->tail == p_queue->head)
- {
- p_queue->tag = 0;
- }
- return p_queue->tag ;
- }
- /* 测试第一种环形队列*/
- void test5()
- {
- RINGQ rq, * p_queue;
- int i,data;
- p_queue = &rq;
- ringq_init(p_queue);
- for(i=0; i < QUEUE_MAX +2 ; i++)
- {
- ringq_push(p_queue,i+1);
- }
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- ringq_free(p_queue);
- }
- /* 测试第一种环形队列,更加复杂的情况*/
- void test6()
- {
- RINGQ rq, * p_queue;
- int i,data;
- p_queue = &rq;
- ringq_init(p_queue);
- ringq_push(p_queue,1);
- ringq_push(p_queue,2);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- ringq_push(p_queue,3);
- ringq_push(p_queue,4);
- ringq_push(p_queue,5);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- ringq_push(p_queue,6);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- if(ringq_poll(p_queue,&data)>=0)
- PRINT_INT(data);
- ringq_free(p_queue);
- }
出队操作:如果队列不空,则从head处读出。
- #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
- #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;
- }