代码:
#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10
typedef int ElemType; //将int 类型定义为ElemType,ElemType也可以是其它类型char,double等等
typedef struct//之所以非常规就在于结构体里面定义的不是一个数组而是两个指针 { ElemType *base;//栈底指针 ElemType *top;//栈顶指针 int stackSize;//表示栈容量的大小 }sqStack;
//初始化栈 void initStack(sqStack *s) { s->base=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));栈底指针指向所申请的这一片空间的第一个地址 if(!s->base) { printf("No Enough Space!\n"); exit(0); } s->top =s ->base;//初始化栈顶和栈底相等说明此时栈为空 s->stackSize = STACK_INIT_SIZE; }
//压栈操作Push void Push(sqStack *s,ElemType e) { if(s->top-s->base>=s->stackSize)//如果栈顶减去栈底等于栈的容量则表示栈满 {s->base = (ElemType*)realloc(s->base,(s->stackSize + STACKINCREMENT)*sizeof(ElemType));//扩大栈的容量,realloc像c++里面的拷贝构造函数,可以对比理解
if(!s->base) { printf("No Enough Space!\n"); exit(0); } } *(s->top) = e; s->top++; }
//出栈操作 int Pop(sqStack *s,ElemType *e) { if(s->top == s->base) return 0; *e = *--(s->top); return 1; }
//计算栈的长度(有几个元素) int GetStackLength(sqStack *s) { int length=0; length=s->top-s->base; return length; }
//栈的销毁 void DestroyStack(sqStack *s) { int i,len ; len=s->stackSize; for(i=0;i<len;i++) { free (s->base);//从栈底依次释放每个空间 s->base++; } s->base = s->top=NULL; s->stackSize=0; }
//清空栈,清空和销毁不一样清空只是把指针改变(数据还在只是不能访问了,下次进栈将被覆盖) void ClearStack(sqStack*s) { s->top=s->base; } int main() { int i,e,num,length; sqStack *s=(sqStack*)malloc(sizeof(sqStack)); initStack(s); printf("请输入需要入栈的数(EOF):"); while (scanf("%d",&num)!=EOF)//循环输入EOF结束(ctrl+z) { Push(s,num); } length=GetStackLength(s); printf("栈的长度为:%d\n",length); printf("出栈:\n"); while(length>0) { Pop(s ,&e); printf("%d ",e); length--; } DestroyStack(s); return 0; }