链栈
1 /* 2 链栈 3 LJK 2018-07-04 4 */ 5 #include<stdio.h> 6 #include<stdlib.h> 7 8 #define MAXSIZE 15 9 #define OK 1 10 #define ERROR 0 11 #define TRUE 1 12 #define FALSE 0 13 14 typedef int SElemType; 15 typedef int Status; 16 17 // 链栈结点 18 typedef struct stackNode 19 { 20 SElemType data; 21 struct stackNode *next; 22 }StackNode; 23 24 // 链栈结构 25 typedef struct linkStack 26 { 27 StackNode *top; 28 int count; 29 }LinkStack; 30 31 // 构造一个空栈 32 Status InitStack(LinkStack *S) 33 { 34 S->top = NULL; 35 S->count = 0; 36 return OK; 37 } 38 39 // 插入 e 为新的栈顶元素 40 Status Push(LinkStack *S, SElemType e) 41 { 42 StackNode *s = (StackNode*)malloc(sizeof(StackNode)); 43 s->data = e; 44 s->next = S->top; 45 S->top = s; 46 S->count++; 47 return OK; 48 } 49 50 // 遍历显示链栈 51 Status StackTraverse(LinkStack S) 52 { 53 StackNode *p = S.top; 54 while (p) 55 { 56 printf("%d ", p->data); 57 p = p->next; 58 } 59 printf("\n"); 60 return OK; 61 } 62 63 // 若栈不空,则删除栈顶元素,用e返回其值 64 Status Pop(LinkStack *s, SElemType *e) 65 { 66 StackNode *p; 67 if (s->top == NULL) return ERROR; 68 *e = s->top->data; 69 p = s->top; 70 s->top = s->top->next; 71 free(p); 72 s->count--; 73 return OK; 74 } 75 76 Status StackEmpty(LinkStack S) 77 { 78 if (S.count == 0) return TRUE; 79 else return FALSE; 80 } 81 82 Status GetTop(LinkStack S, SElemType *e) 83 { 84 if (S.top == NULL) return ERROR; 85 *e = S.top->data; 86 return OK; 87 } 88 89 int StackLength(LinkStack S) 90 { 91 return S.count; 92 } 93 94 // 将S设置为空栈 95 Status ClearStack(LinkStack *S) 96 { 97 StackNode *p, *q; 98 p = S->top; 99 while (p) 100 { 101 q = p; 102 p = p->next; 103 free(q); 104 } 105 S->top = NULL; 106 S->count = 0; 107 return OK; 108 } 109 110 int main() 111 { 112 LinkStack s; 113 int j; 114 SElemType e; 115 116 if (InitStack(&s) == OK) 117 { 118 for ( j = 1; j <= 10; j++) 119 Push(&s, j); 120 } 121 printf("Stack:"); 122 StackTraverse(s); 123 124 Pop(&s, &e); 125 printf("栈顶 e = %d\n", e); 126 printf("Stack:"); 127 StackTraverse(s); 128 printf("\n"); 129 130 printf("栈空否:%d (1:空 0:否)\n", StackEmpty(s)); 131 printf("\n"); 132 133 printf("Len(stack) = %d\n", StackLength(s)); 134 printf("\n"); 135 136 ClearStack(&s); 137 printf("清空栈后:\n"); 138 printf("栈空否:%d (1:空 0:否)\n", StackEmpty(s)); 139 printf("Len(stack) = %d\n", StackLength(s)); 140 printf("\n"); 141 142 getchar(); 143 return 0; 144 }