#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) STACK##name.size #endif 以上保存为stack.h 测试程序 #include "stack.h" #include <stdio.h> #include <stdlib.h> int main(void) { DECLARE(int,A); DECLARE(double,B); double b; int a=49; INIT(A); INIT(B); //printf("STACKA.base->data: %d /n",STACKA.base->data); printf("%d /n",LENGTH(A)); for(a=1;a<=10000 ;a++){ PUSH(A,a); PUSH(A,a); PUSH(A,a); printf("STACKA.top->data: %d /n",STACKA.top->data); } printf("%d /n",LENGTH(A)); printf("STACKA.base->data: %d /n",STACKA.base->data); for(b=1;b<=10000;b++){ PUSH(B,b); printf("STACKB.top->data: %lf /n",STACKB.top->data); } while( ! EMPTY(A)){ POP(A,&a); if( ! EMPTY(B)){ POP(B,&b); } } CLEAR(A); system("PAUSE"); return 0; }