92 lines
1.7 KiB
C
92 lines
1.7 KiB
C
/*
|
||
* ring_queue.c
|
||
*
|
||
* Created on: 2024年6月21日
|
||
* Author: psx
|
||
*/
|
||
|
||
|
||
//循环队列
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include "ring_queue.h"
|
||
|
||
//#define RING_QUEUE_DEBUG
|
||
|
||
//#ifdef RING_QUEUE_DEBUG
|
||
//#define //rq_debug term_printf
|
||
//#else
|
||
//void rq_debug(const char *fmt, ...){};
|
||
//#endif
|
||
|
||
#define RQ_OK 1
|
||
#define RQ_ERROR 0
|
||
#define RQ_OVERFLOW -2
|
||
|
||
//初始化队列
|
||
int InitRingQueue(RingQueue *q, RQ_ElementType *buff, int size)
|
||
{
|
||
q->elems = buff;
|
||
q->size = size;
|
||
q->front=q->rear=0;
|
||
return RQ_OK;
|
||
}
|
||
|
||
//遍历队列,
|
||
//消费者使用,故对生产者可能修改的rear先读取缓存
|
||
int ShowRingQueue(RingQueue *q)
|
||
{
|
||
//int i;
|
||
int rear = q->rear;
|
||
|
||
if(q->front == rear)
|
||
{
|
||
//rq_debug("队列为空\n");
|
||
return RQ_ERROR;
|
||
}
|
||
//rq_debug("队列中的元素为:\n");
|
||
//for(i=((q->front)%q->size); i != rear; i=((i+1)%q->size))
|
||
//rq_debug(" %c\n",q->elems[i]);
|
||
|
||
//rq_debug("\n");
|
||
//rq_debug("队首元素为%c\n",q->elems[q->front]);
|
||
//rq_debug("队尾元素为%c\n",q->elems[rear - 1]);
|
||
return RQ_OK;
|
||
}
|
||
|
||
//向队尾插入元素e
|
||
int InRingQueue(RingQueue *q,RQ_ElementType e)
|
||
{
|
||
if(RingQueueFull(q))
|
||
{
|
||
//rq_debug("空间不足\n");
|
||
return(RQ_OVERFLOW);
|
||
}
|
||
q->elems[q->rear] = e;
|
||
q->rear = (q->rear+1) % q->size;
|
||
//rq_debug("rear = %d\n",q->rear);
|
||
return RQ_OK;
|
||
}
|
||
|
||
//从队首取回并删除元素
|
||
int OutRingQueue(RingQueue *q, RQ_ElementType *e)
|
||
{
|
||
if(RingQueueEmpty(q))
|
||
{
|
||
//rq_debug("队列为空\n");
|
||
return RQ_ERROR;
|
||
}
|
||
*e = q->elems[q->front];
|
||
//rq_debug("被删除的队首元素为%c\n",q->elems[q->front]);
|
||
q->front = (q->front+1) % q->size;
|
||
return RQ_OK;
|
||
}
|
||
|
||
//队列中的元素个数
|
||
int RingQueueLength(RingQueue *q)
|
||
{
|
||
return ((q->rear - q->front) + q->size) % q->size;
|
||
}
|
||
|
||
|