1. 队列类型及操作的宏定义:

//队列类型表示:Queue_元素类型(如元素为整形的队列类型为:Queue_int)
//_ET:元素类型
#defineQ_TYPE(_ET)Queue_##_ET
//队列变量定义:每个队列对应一个数组,用于存放元素,数组名表示成:qBuf##queue
//在定义队列变量时需指定队列长度:由len指定
//ET:元素类型
//queue:队列变量名
//len:队列长度
#defineQ_DEFINE(ET,queue,len)
ETqBuf##queue[len];
intqBufLen##queue=sizeof(ET)*len;
Q_TYPE(ET)queue
//队列类型(结构体)定义:
//ET:元素类型
//Queue_##ET:具体化后的队列类型,由不同的元素类型决定
#defineQ_TYPE_DEFINE(ET)
typedefstruct
...{
ET*pElems;
intfront,rear,size;
intmaxSize;
}Queue_##ET;
//队列变量声明表示:用于声明外部全局变量
//ET:元素类型
//queue:队列变量名
#defineQ_EXTERN(ET,queue)
externETqBuf##queue[];
externintqBufLen##queue;
externQ_TYPE(ET)queue
//队列初始化
#defineQ_INIT(queue,len)
...{
memset(qBuf##queue,0,qBufLen##queue);
queue.pElems=qBuf##queue;
queue.size=0;
queue.front=queue.rear=0;
queue.maxSize=len;
}
//队空
#defineQ_EMPTY(queue)(queue.front==queue.rear)
//队满
#defineQ_FULL(queue)((queue.rear+1)%queue.maxSize==queue.front)
//入队
#defineQ_PUT(queue,pput)
...{
if(Q_FULL(queue))
...{
Uart_Printf("MQOF ");
}
else
...{
queue.pElems[queue.rear]=*pput;
queue.size++;
queue.rear=(queue.rear+1)%queue.maxSize;
}
}
//出队
#defineQ_GET(queue,pget)
...{
if(queue.front==queue.rear)
...{
pget=NULL;
}
else
...{
inthead=queue.front;
queue.front=(queue.front+1)%queue.maxSize;
pget=&queue.pElems[head];
queue.size--;
}
}
//队列类型实例化:根据指定的不同类型
Q_TYPE_DEFINE(sGUI_MESSAGE)//消息队列
Q_TYPE_DEFINE(char)
2.定义队列:
//定义队列长度
#defineMSG_QUEUE_LEN100//预定义消息队列的长度
#defineKBD_BUF_LEN10
//定义队列变量
Q_DEFINE(sGUI_MESSAGE,msgQueue,MSG_QUEUE_LEN);
Q_DEFINE(char,keyQueue,KBD_BUF_LEN);
//显式初始化
voidq_init()
...{
Q_INIT(msgQueue,MSG_QUEUE_LEN);
Q_INIT(keyQueue,KBD_BUF_LEN);
}
3.外部引用队列变量:
//外部引用,使用声明Q_EXTERN表达式
Q_EXTERN(sGUI_MESSAGE,msgQueue);
Q_EXTERN(char,keyQueue);
4.操作队列:
inti=65;
while(!Q_FULL(keyQueue))
...{
Q_PUT(keyQueue,&i);
i++;
}
char*pch;
while(!Q_EMPTY(keyQueue))
...{
Q_GET(keyQueue,pch);
if(pmsg)
printf("%c ",*pch);
}
本文介绍了一种通过宏定义实现队列数据结构的方法。详细解释了如何定义不同类型的队列,包括消息队列和字符队列,并展示了队列的初始化、入队和出队等操作。
792

被折叠的 条评论
为什么被折叠?



