栈的链式存储方法的C语言实现
1 /* 2 编译器:Dev-c++ 5.4.0 3 文件名:linkStack.cpp 4 代码版本号:1.0 5 时间:2015年10月15日18:56:06 6 7 */ 8 #include <stdio.h> 9 #include <stdlib.h> 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 }