#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
#define stack_init_size 100
#define STACKINCREMENT 10
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
void Initsize(sqStack *s)
{
s->base=(ElemType*)malloc(stack_init_size*sizeof(ElemType));
if(s->base==0)
exit(1); //分配失败
s->top=s->base; //栈顶就是栈低
s->stackSize=stack_init_size;//栈的最大量而不是当前容量
}
void Destroy(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 Clear(sqStack *s)
{
s->top=s->base; //将栈中的元素全部作废,表明这个栈是空的。因为只是操作上top和base一样了只清空了列表没有清除值。
}
int GetTop(sqStack *s)
{
int i=0;
if(s->top==s->base)
{
return 0;
}
else
i=*(s->top-1);
return i;
}
void Push(sqStack *s, ElemType e)
{
// 如果栈满,追加空间
if( s->top-s->base >= s->stackSize )
{
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if( !s->base )
exit(0);
s->top=s->base+s->stackSize; // 设置栈顶
s->stackSize=s->stackSize+STACKINCREMENT; // 设置栈的最大容量
}
*(s->top) = e;
s->top++;
}
int Pop(sqStack *s)
{ int e;
if( s->top == s->base ) // 栈已空
return 0;
else{
s->top--;
e=*(s->top);
return e;
}
}
int StackTraverse(sqStack S)
{
ElemType *p;
if (S.base == NULL)
{
exit(1);
}
else if (S.top == S.base)
{
printf("栈中没有元素……\n");
exit(1);
}
else
{
p = S.top;
while (p > S.base)
{
p--;
printf("%d ",*p);
}
return 0;
}
}
void main()
{
sqStack s;
int i,n,e,k;
printf("初始化一个栈");
Initsize(&s);
printf("输入栈的长度:\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("输入栈的第%d个元素\n",i);
++s.top;
scanf("%d",s.top-1);
}
printf("遍历:");
StackTraverse(s);
e=GetTop(&s);
printf("\n栈顶元素是%d\n",e);
printf("\n请输入要插入的元素数值:");
scanf("%d",&k);
Push(&s,k);
printf("遍历:");
StackTraverse(s);
printf("\n栈顶删除元素是:");
e=Pop(&s);
printf("%d\n",e);
printf("\n");
printf("遍历:");
StackTraverse(s);
printf("清空栈\n");
Clear(&s);
printf("遍历:");
StackTraverse(s);
printf("销毁栈\n");
Destroy(&s);
}