1 /* 2 编译器:Dev-c++ 5.4.0 3 文件名:linkStack.cpp 4 代码版本号:1.0 5 时间:2015年10月15日18:56:06 6 7 */ 8 #include9 #include 10 #define ERROR 0 11 #define OK 1 12 #define FALSE 0 13 #define TRUE 1 14 #define OVERFLOW -2 15 16 typedef int sElemType; 17 typedef int Status; 18 typedef struct lNode{ 19 sElemType data; 20 struct lNode *next; 21 }lNode,*linkStack; 22 23 24 /*初始化空栈*/ 25 Status initStack(linkStack *s){ 26 *s=(linkStack)malloc(sizeof(lNode)); 27 if(!(*s)) 28 exit(OVERFLOW); 29 (*s)->next=NULL; 30 return OK; 31 } 32 33 /*销毁栈*/ 34 Status destroyStack(linkStack *s){ 35 lNode *p=(*s)->next; 36 lNode *q; 37 if(!p){ 38 return OK; 39 } 40 while(p){ 41 q=p; 42 p=p->next; 43 free(q); 44 } 45 return OK; 46 } 47 48 /*把S栈置为空栈*/ 49 Status clearStack(linkStack *s){ 50 (*s)->next=NULL; 51 return OK; 52 } 53 54 /*判断栈是否为空栈*/ 55 bool emptyStack(linkStack *s){ 56 if((*s)->next) 57 return FALSE; 58 else 59 return TRUE; 60 } 61 62 int stackLength(linkStack *s){ 63 int len=0; 64 *s=(*s)->next; 65 while(*s){ 66 *s=(*s)->next; 67 len++; 68 } 69 return len; 70 } 71 /*入栈*/ 72 Status push(linkStack *s,sElemType e){ 73 lNode *p=(*s); 74 while(p->next){ 75 p=p->next; 76 } 77 p->next=(linkStack)malloc(sizeof(lNode)); 78 p->next->data=e; 79 p->next->next=NULL; 80 return OK; 81 } 82 83 /*出栈*/ 84 Status pop(linkStack *s,sElemType *e){ 85 lNode *p=(*s); 86 lNode *q; 87 while(p->next){ 88 q=p; 89 p=p->next; 90 } 91 q->next=NULL; 92 *e=p->data; 93 free(p); 94 return OK; 95 } 96 97 /*得到栈顶元素*/ 98 Status getTop(linkStack *s,sElemType *e){ 99 lNode *p=(*s);100 if(!p->next){101 printf("栈为空,无法得到栈顶元素\n");102 return ERROR; 103 }104 105 while(p->next){106 p=p->next;107 }108 *e=p->data;109 return OK;110 } 111 112 int visit(sElemType c){113 printf("%d ",c);114 return 1;115 }116 /*遍历栈*/117 Status stackTraverse(linkStack *s,int (*visit)(sElemType)){118 linkStack p=(*s)->next; 119 while(p){120 visit(p->data);121 p=p->next;122 }123 return OK;124 }125 126 int main(){127 linkStack S;128 initStack(&S);129 sElemType e;130 for(e=1;e<=5;e++)131 push(&S,e); 132 printf("\n遍历前:");133 stackTraverse(&S,visit);134 int i;135 for(i=1;i<=1;i++)136 pop(&S,&e);137 printf("\n弹出%d个元素后:",i-1);138 stackTraverse(&S,visit);139 getTop(&S,&e);140 printf("\n栈顶元素为:%d",e);141 clearStack(&S);142 if(emptyStack(&S))143 printf("\n栈变为空栈了"); 144 system("pause");145 return 0;146 }