描述:栈的几种操作,可以在纯C编译器中运行
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define TRUE 1 5 #define FALSE 0 6 #define OK 1 7 #define ERROR 0 8 #define OVERFLOW -1 9 #define STACK_INIT_SIZE 100 10 #define STACKINCREMENT 10 11 typedef int ElemType; 12 typedef int Status; 13 14 typedef struct{ 15 ElemType *base; 16 ElemType *top; 17 int stacksize; 18 }SqStack; 19 20 //构建一个空栈 21 Status InitStack(SqStack *S) 22 { 23 S->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); 24 if(!S->base) 25 { 26 exit(OVERFLOW); 27 } 28 S->top = S->base; 29 S->stacksize = STACK_INIT_SIZE; 30 31 return OK; 32 } 33 34 //销毁一个栈 35 Status DestoryStack(SqStack *S) 36 { 37 S->top = NULL; 38 S->stacksize = 0; 39 free(S->base); 40 41 return OK; 42 43 } 44 45 //清空一个栈 46 Status ClearStack(SqStack *S) 47 { 48 S->top = S->base; 49 50 return OK; 51 } 52 53 //判断栈是否为空 54 Status EmptyStack(SqStack S) 55 { 56 if(S.top == S.base) 57 { 58 return TRUE; 59 } 60 else 61 { 62 return FALSE; 63 } 64 } 65 66 //返回栈长度 67 ElemType LengthStack(SqStack S) 68 { 69 return S.top - S.base; 70 } 71 72 //返回栈顶元素 73 ElemType GetTop(SqStack S) 74 { 75 if(S.base == S.top) 76 { 77 return FALSE; 78 } 79 else 80 { 81 return *(S.top - 1); 82 } 83 } 84 85 //入栈 86 Status Push(SqStack *S, ElemType e) 87 { 88 if(S->top - S->base >= STACK_INIT_SIZE) 89 { 90 S->base = (ElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT)*sizeof(ElemType)); 91 if(!S->base) 92 { 93 exit(OVERFLOW); 94 } 95 S->top = S->base + STACK_INIT_SIZE; 96 S->stacksize = STACK_INIT_SIZE + STACKINCREMENT; 97 } 98 *S->top = e; 99 S->top++; 100 101 return OK; 102 } 103 104 //出栈 105 Status Pop(SqStack *S) 106 { 107 if(S->top == S->base) 108 { 109 return ERROR; 110 } 111 else 112 { 113 S->top--; 114 return *S->top; 115 } 116 } 117 118 //遍历栈 119 Status StackTraverse(SqStack S) 120 { 121 ElemType *p = S.top; 122 123 if(S.base == NULL) 124 { 125 return ERROR; 126 } 127 if(p == S.base) 128 { 129 printf("the stack is empty. "); 130 } 131 while(p > S.base) 132 { 133 p--; 134 printf("%d", *p); 135 } 136 137 return OK; 138 }
PS:参考了别人的代码(https://blog.csdn.net/liujiuxiaoshitou/article/details/53394888),稍微做了点修改,可以在纯C编译器中运行,写下来之后对于指针和结构体有了更深入的认识,另C语言中重复定义会报错