学分指南  学分抽奖  学分竞答  学分竞猜
普通帖C宏写的栈型栈<处理多种数据类型>
rugh48 2008-11-13 19:58:16 [个人资料] [Blog]
[回复] 楼主 分数:0
[quote]
下面的这个东东是我用C宏写的,在DEV C++4.9.9.0下编译通过.
这个是头文件"stack.h"
#ifndef AVALON_STACK_H
#define AVALON_STACK_H
#include
#include
#include

#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
#include

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;
}
[/quote]
  
aopif23 2008-11-13 22:38:54 [个人资料] [Blog]
[回复] [引用] 第1楼 得分:0
这个东西看不懂,很郁闷。
  
马甲也是人 2008-12-5 16:42:17 [个人资料] [Blog]
[回复] [引用] 第2楼 得分:0
不清楚 等高手
  
广告也精彩
 
1
快速回复:
注意:本论坛里的任何言论仅代表发言者个人的观点,与学赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的帖子违反学赛网论坛规则,将立即删除;如果再次发布,则封IP。
loading...