c语言用宏实现模板-以队列为例
2011-05-10 12:46
225 查看
1. 队列类型及操作的宏定义:
//队列类型表示:Queue_元素类型(如元素为整形的队列类型为:Queue_int)
//_ET:元素类型
#define Q_TYPE(_ET) Queue_##_ET
//队列变量定义:每个队列对应一个数组,用于存放元素,数组名表示成:qBuf##queue
//在定义队列变量时需指定队列长度:由len指定
//ET: 元素类型
//queue: 队列变量名
//len: 队列长度
#define Q_DEFINE(ET,queue,len)
ET qBuf##queue[len];
int qBufLen##queue = sizeof(ET)*len;
Q_TYPE(ET) queue
//队列类型(结构体)定义:
//ET: 元素类型
//Queue_##ET: 具体化后的队列类型,由不同的元素类型决定
#define Q_TYPE_DEFINE(ET)
typedef struct
{
ET* pElems;
int front, rear, size;
int maxSize;
}Queue_##ET;
//队列变量声明表示: 用于声明外部全局变量
//ET: 元素类型
//queue: 队列变量名
#define Q_EXTERN(ET, queue)
extern ET qBuf##queue[];
extern int qBufLen##queue;
extern Q_TYPE(ET) queue
//队列初始化
#define Q_INIT(queue, len)
{
memset(qBuf##queue, 0, qBufLen##queue);
queue.pElems = qBuf##queue;
queue.size = 0;
queue.front = queue.rear = 0;
queue.maxSize = len;
}
//队空
#define Q_EMPTY(queue) (queue.front == queue.rear)
//队满
#define Q_FULL(queue) ((queue.rear + 1) % queue.maxSize == queue.front)
//入队
#define Q_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;
}
}
//出队
#define Q_GET(queue, pget)
{
if(queue.front == queue.rear)
{
pget = NULL;
}
else
{
int head = 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.定义队列:
//定义队列长度
#define MSG_QUEUE_LEN 100 // 预定义消息队列的长度
#define KBD_BUF_LEN 10
//定义队列变量
Q_DEFINE(sGUI_MESSAGE,msgQueue,MSG_QUEUE_LEN);
Q_DEFINE(char,keyQueue,KBD_BUF_LEN);
//显式初始化
void q_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.操作队列:
int i = 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);
}
//队列类型表示:Queue_元素类型(如元素为整形的队列类型为:Queue_int)
//_ET:元素类型
#define Q_TYPE(_ET) Queue_##_ET
//队列变量定义:每个队列对应一个数组,用于存放元素,数组名表示成:qBuf##queue
//在定义队列变量时需指定队列长度:由len指定
//ET: 元素类型
//queue: 队列变量名
//len: 队列长度
#define Q_DEFINE(ET,queue,len)
ET qBuf##queue[len];
int qBufLen##queue = sizeof(ET)*len;
Q_TYPE(ET) queue
//队列类型(结构体)定义:
//ET: 元素类型
//Queue_##ET: 具体化后的队列类型,由不同的元素类型决定
#define Q_TYPE_DEFINE(ET)
typedef struct
{
ET* pElems;
int front, rear, size;
int maxSize;
}Queue_##ET;
//队列变量声明表示: 用于声明外部全局变量
//ET: 元素类型
//queue: 队列变量名
#define Q_EXTERN(ET, queue)
extern ET qBuf##queue[];
extern int qBufLen##queue;
extern Q_TYPE(ET) queue
//队列初始化
#define Q_INIT(queue, len)
{
memset(qBuf##queue, 0, qBufLen##queue);
queue.pElems = qBuf##queue;
queue.size = 0;
queue.front = queue.rear = 0;
queue.maxSize = len;
}
//队空
#define Q_EMPTY(queue) (queue.front == queue.rear)
//队满
#define Q_FULL(queue) ((queue.rear + 1) % queue.maxSize == queue.front)
//入队
#define Q_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;
}
}
//出队
#define Q_GET(queue, pget)
{
if(queue.front == queue.rear)
{
pget = NULL;
}
else
{
int head = 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.定义队列:
//定义队列长度
#define MSG_QUEUE_LEN 100 // 预定义消息队列的长度
#define KBD_BUF_LEN 10
//定义队列变量
Q_DEFINE(sGUI_MESSAGE,msgQueue,MSG_QUEUE_LEN);
Q_DEFINE(char,keyQueue,KBD_BUF_LEN);
//显式初始化
void q_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.操作队列:
int i = 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);
}
相关文章推荐
- C语言 循环队列的实现
- (C语言队列的顺序实现(数据结构十)
- C语言实现使用静态数组实现循环队列
- C语言实现使用动态数组实现循环队列
- 模板实现循环队列
- 循环队列操作之一:循环队列的表示和实现(C语言版本)
- 队列-C语言-链表的实现方式
- 栈和队列 C语言实现
- 数据结构 --静态队列的一个简单的C语言代码实现
- 链式队列ADT实现(C语言)2018.3.14
- 队列的数组实现(C语言描述)
- C语言连续存储实现队列机制
- 数据结构——队列的链式实现(C语言)
- c语言实现普通队列
- 用两个栈实现队列(C++模板)
- C语言一个队列的实现
- 队列的链式结构C语言实现
- C语言实现队(循环队列)
- 优化后队列的实现(C语言实现)
- 链队列的综合操作(详解、演示)C语言实现