#define QUEUE_SIZE 3 //队列的大小
typedef struct
{
int Queue[QUEUE_SIZE];
int Rd; //读位置
int Wr; //写位置
}QueueType;
static QueueType tQueue; //定义队列
int QueueIsEmpty();
int QueueIsFull();
/**
* @brief 队列初始化
* @param[in] *pTmp:队列数据
* @param[out] NO
* @return NO
* @note
*/
void QueueInit(QueueType *pTmp)
{
memset(&tQueue,0,sizeof(QueueType));
}
/**
* @brief 从队列中读出一个元素
* @param[in] NO
* @param[out] *p:读出的元素
* @return 0:OK
-1:队列已空,读取失败
* @note
*/
int QueueRd(int *p)
{
if (QueueIsEmpty()==-1)
{
tQueue.Rd =(tQueue.Rd+1)%QUEUE_SIZE;//首尾相接
*p =tQueue.Queue[tQueue.Rd];
return 0;
}
else
{
return -1;
}
}
/**
* @brief 向队列写入一个元素
* @param[in] Value:写入的元素
* @param[out] NO
* @return 0:OK
-1:队列已满,写入失败
* @note
*/
int QueueWr(int Value)
{
if (QueueIsFull()==-1)
{
tQueue.Wr =(tQueue.Wr+1)%QUEUE_SIZE;//首尾相接
tQueue.Queue[tQueue.Wr] =Value;
return 0;
}
else
{
return -1;
}
}
/**
* @brief 判断队列是否是满的
* @param[in] NO
* @param[out] NO
* @return 0:队列已满
-1:队列非满
* @note
*/
int QueueIsFull()
{
if ( ((tQueue.Rd==0) && (tQueue.Wr+1==QUEUE_SIZE))
|| (tQueue.Rd-tQueue.Wr==1)
)
{
return 0;
}
else
{
return -1;
}
}
/**
* @brief 判断队列是否是空的
* @param[in] NO
* @param[out] NO
* @return 0:队列已空
-1:队列非空
* @note
*/
int QueueIsEmpty()
{
if (tQueue.Rd == tQueue.Wr)
{
//已空
return 0;
}
else
{
return -1;
}
}
void main()
{
int i=0,tmp,*p;
p =&tmp;
QueueInit(&tQueue);
while(1)
{
QueueWr(++i);
QueueRd(p);
}
}