c语言用宏实现模板-以队列为例

原创 2007年09月20日 19:20:00

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);
    }

 

 

相关文章推荐

c语言用宏实现模板-以队列为例

1. 队列类型及操作的宏定义://队列类型表示:Queue_元素类型(如元素为整形的队列类型为:Queue_int)//_ET:元素类型#define Q_TYPE(_ET) Queue_##_ET/...
  • immcss
  • immcss
  • 2011年05月10日 12:46
  • 4978

C语言实现的队列Queue

  • 2013年01月16日 04:20
  • 589B
  • 下载

数据结构与算法分析学习笔记三-循环队列C语言实现

队列,在日常生活中有很多非常直观的例子。实际生活中的每次排队都是一个队列。今天我们就来看看循环队列的如何用简单的C语言来实现。本文中所有的代码均在anycodes.tk在线编程网站上测试通过。...

C语言实现队列的多态性操作

  • 2012年02月08日 14:15
  • 3KB
  • 下载

数据结构C语言实现之循环队列

#include #include //定义函数结果状态码 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 //定义循环队...

C语言实现链式队列

  • 2015年09月08日 17:34
  • 2KB
  • 下载

C语言队列实现广度优先遍历

上一篇只是定义了数据结构。 基于上一篇http://blog.csdn.net/xzongyuan/article/details/21832237增加了队列操作。 打印出来的结果是这样的,没...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言用宏实现模板-以队列为例
举报原因:
原因补充:

(最多只允许输入30个字)