代码:
#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;
}