泛型栈

来源:互联网 发布:软件开发企业收入确认 编辑:程序博客网 时间:2024/06/11 09:07

泛型栈

#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 0typedef 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;}
原创粉丝点击