宏定义模板 zz
来源:互联网 发布:it维修 编辑:程序博客网 时间:2024/05/16 11:08
用C宏写的泛型栈
下面的这个东东是我用C宏写的,在DEV C++4.9.9.0下编译通过.这个是头文件"stack.h"
======================================================================
#ifndef AVALON_STACK_H
#define AVALON_STACK_H
#include <stdio.h>
#include <string.h>
#include <assert.h>
#ifndef AVALON_BOOL
#define AVALON_BOOL
#define TRUE 1
#define FALSE 0
typedef int BOOL;/*自定义的BOOL型*/
#endif
/*定义一个栈结构*/
#define DECLARE_NODE(type,name) /
typedef struct type##NODE/
{/
type data;/
struct type##NODE *prior;/
}NODE##name;
#define DECLARE_STACK(type,name) /
struct type##STACK/
{/
int size;/
struct type##NODE *base;/
struct type##NODE *top;/
}STACK##name;
/*泛类型栈定义*/
#define DECLARE(type,name) /
DECLARE_NODE(type,name); /
DECLARE_STACK(type,name);
/****************************************************/
/*初始化栈,name为新声明的栈名字的地址 */
#define INIT(name) /
do{/
STACK##name.base=STACK##name.top=NULL;/
STACK##name.size=0;/
}while(0)
/*********** 不破坏栈顶元素取值*************************/
#define GET(name,elem) /
do{/
if(STACK##name.size != 0){/
elem=STACK##name.top->data; /
}/
}while(0)
/************** 压入元素elem **************************/
#define PUSH(name,elem) /
do{/
NODE##name *temp=(NODE##name *)malloc(sizeof(NODE##name));/
assert(temp);/
temp->data=elem ;/
(STACK##name.size)++; /
if(1 != STACK##name.size ){ /
temp->prior=STACK##name.top;/
STACK##name.top=temp;/
}/
else{/
temp->prior=NULL;/
STACK##name.top=STACK##name.base=temp;/
}/
}while(0)
/********** 栈顶元素赋值给elem,并弹出 ***********/
#define POP(name,elem) /
do{/
NODE##name * temp=STACK##name.top;/
if(STACK##name.size !=0 ){ /
*elem =STACK##name.top->data; /
if( STACK##name.size !=1){ /
STACK##name.top =temp->prior; /
free(temp);/
}/
else /
STACK##name.top=STACK##name.base=NULL;/
(STACK##name.size)--;/
}/
}while(0)
/************** 清空栈 ************************/
#define CLEAR(name) /
do{/
NODE##name * temp;/
while( STACK##name.size-- !=0){/
temp=STACK##name.top;/
STACK##name.top=STACK##name.top->prior;/
free(temp);/
}/
STACK##name.size=0;/
STACK##name.base=STACK##name.top=NULL;/
}while(0)
/****************栈空???? ************************/
#define EMPTY(name) ( STACK##name.size == 0 )
/*****************长度 ************************/
#define LENGTH(name) (1 ? STACK##name.size : 0)
#endif
这个是测试程序:
=======================================================================
#include "stack.h"
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
DECLARE(int,A);
DECLARE(double,B);
double b;
int a;
INIT(A);
INIT(B);
printf("%d ",LENGTH(A));
for(a=1;a<=10000 ;a++){
PUSH(A,a);
PUSH(A,a);
PUSH(A,a);
}
printf("%d ",LENGTH(A));
for(b=1;b<=10000;b++){
PUSH(B,b);
}
while( ! EMPTY(A)){
POP(A,&a);
if( ! EMPTY(B)){
POP(B,&b);
}
}
CLEAR(A);
system("PAUSE");
return 0;
}
- 宏定义模板 zz
- C:宏定义 zz
- ZZ参数个数可变的宏定义
- (ZZ) 宏定义展开顺序的分析
- zabbix模板、宏定义。
- 模板函数的声明和定义都放在.h文件[zz]
- 模板引擎SMARTY(zz)
- 定义模板
- 定义模板
- (zz)定义函数对象
- 完备性的定义(ZZ)
- Outlook 创建邮件模板 (zz)
- c 语言常用宏定义 模板
- c 语言常用宏定义 模板
- c语言常用宏定义模板
- 类模板和宏定义应用
- 【zz】JavaScript函数定义语法总结
- 模板中定义变量
- 给中国学生的第二封信:从优秀到卓越
- Performance Tuning Techinques.
- 今天在书店碰见候捷老师了:)
- 给中国学生的第三封信:成功、自信、快乐
- 关于幸福
- 宏定义模板 zz
- 打碎英文连续显示所用的css
- asp.net 2.0中一次性更新所有GRIDVIEW的记录
- UpdateBatch与事务处理的一点总结
- 远程注册自己的组件
- 微软.net精简框架最常见问题。 选择自 jinco 的 Blog
- 深入Struts 1.1(分离struts配置文件)
- 完成了简单记事本程序的编写
- 一个掌握Struts企业级Web开发框架的实例