宏定义模板 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;
}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有恶露排不出来怎么办 刚生完小孩便秘怎么办 产后15天有鲜血怎么办 恶露未净同房了怎么办 药流2月恶露不尽怎么办 生完孩子小腹痛怎么办 月子里恶露有异味怎么办 恶露干净了有异味怎么办 顺产后恶露白色异味怎么办 产妇排出的恶露有异味怎么办 恶露有股腥臭味怎么办 生完孩子下面有异味怎么办 销售货物开票税率错了怎么办 8h床垫有橡胶味怎么办 买回来的鞋子臭怎么办 耐克保修卡没了怎么办 雅萌保修卡没了怎么办 苹果保修卡没了怎么办 新车迟迟不给合格证怎么办 手机系统剩余空间少怎么办 桌子被掉色的袋子印色怎么办 袋子掉色弄到柜子上怎么办 健身房老板跑路教练怎么办 健身房老板跑路了怎么办 淘宝断货了该怎么办 淘金猫网购频道账号换了怎么办 京东商城信用卡无法付款怎么办 京东第三方退货拒收怎么办 淘宝凑单收货地址不一样怎么办 淘宝凑单地址不一样怎么办 任性付还不了款怎么办 京东购物卷删了怎么办 荣耀手环3进水了怎么办 手机疏油层没了怎么办 快递到了处理中心不走了怎么办 京东取消了退款怎么办 我的订单删除了怎么办 近邻宝箱子误关怎么办 把收件人电话写错了怎么办 吧收件人电话写错了怎么办 速递易收件人电话写错怎么办