首页 > 技术文章 > 栈的几种操作(C语言)

OoycyoO 2018-04-10 22:29 原文

描述:栈的几种操作,可以在纯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.\n");
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语言中重复定义会报错

推荐阅读