宏定义模板 zz

原创 2004年10月22日 22:50:00

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

C的宏定义实现模板函数——C的C++模板函数机制实现

近日移植TightVNC,关于RectangleUpdate的编码,处理不同色彩位深bits/pixe( 8,16,32)有着极其相似的处理方法,由于C中没有模板函数的概念,因而采用了宏定义来处理,与...
  • ARLoverKang
  • ARLoverKang
  • 2013年12月05日 09:56
  • 1780

C++ 宏和模板简介

参考《21天学通C++》第14章节,对C++中的宏和模板进行了学习,总结起来其主要内容如下: (1) 预处理器简介 (2) 关键字#define与宏 (3) 模板简介 (4) 如何编写函数模板和模板类...
  • LG1259156776
  • LG1259156776
  • 2015年07月30日 11:44
  • 1595

vi 常用命令 zz

输入模式命令 进入输入输出的方法 命令 ...
  • beff2047
  • beff2047
  • 2006年12月06日 14:35
  • 3986

acm 头文件及宏定义

#include #include #include #include #include #include #include #include #inc...
  • qq_21899803
  • qq_21899803
  • 2016年05月05日 19:21
  • 832

Window7搭建IIS web服务器

欢迎使用Markdown编辑器写博客这一章在计算机上安装和启动了IIS,并配置IIS WEB站点 1.首先需要安装IIS,注意win7有的系统中即使安装了IIS,在开始菜单中也是找不到的,我们先装上...
  • ZZMJ_F
  • ZZMJ_F
  • 2017年03月27日 23:54
  • 208

VIM 高阶

安装vim包:   sudo apt-get install vim 普通用户到超级用户的切换:  sudo su 退出超级用户: ctrl+d  或者exit v...
  • klarclm
  • klarclm
  • 2012年09月05日 08:39
  • 988

C:宏定义 zz

使用宏时,用圆括号括住每个参数,并括住宏的整体定义;一般来说,在宏中不要使用自增或自减运算符。 下面是一些常见的宏定义: [1]最值 #define MIN(x, y)   (((x) < (y))...
  • Deutschester
  • Deutschester
  • 2010年08月30日 16:58
  • 501

UI-date-format

1,纯js解决方式 Date.prototype.format = function (format) {   var o = {     "M+": this.getMonth() + 1, ...
  • CSDNCFO
  • CSDNCFO
  • 2014年05月03日 11:03
  • 1025

模板和宏的区别

模板和宏 前些日子,论坛里大打口水仗的时候,有人提出这样一个论断:模板本质上是宏。于是,诸位高手为此好好辩论了一番。我原本也想加入论战,但是觉得众人的言论已经覆盖了我的想法,所以也就作罢了。 尽管...
  • qq_30549833
  • qq_30549833
  • 2015年10月04日 21:49
  • 705

模板与宏的区别

1.宏是在预处理阶段处理,模板是在编译阶段处理 2.宏不会进行类型检查,只会单纯的进行文本替换,模板会进行类型检查。比如下面代码模板就会出错,而宏不会 3.宏直接就可以产生代码,而模板只有当实例后...
  • smilesundream
  • smilesundream
  • 2017年07月11日 17:33
  • 358
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:宏定义模板 zz
举报原因:
原因补充:

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