#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define SElemType int
typedef struct
{
SElemType *base;//栈底
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位;
}SqStack;
void InitStack(SqStack &s)//构建一个空栈s
{
s.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!s.base)
{
printf("构建空栈时失败");
exit(-1);
}
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}
void DestoryStack(SqStack &s)//销毁栈s
{
free(s.base);
}
void ClearStack(SqStack &s)//把s置为空栈
{
s.top=s.base;
}
int StackLength(SqStack s)//栈中元素个数
{
return s.top-s.base;
}
bool StackEmpty(SqStack s)//判断一个栈是否为空
{
if(s.top==s.base)
return true;
else
return false;
}
void GetTop(SqStack s,SElemType &e)//用e返回栈顶元素
{
if(StackEmpty(s))
{
printf("栈空");
exit (-1);
}
e=*(s.top-1);
}
void Push(SqStack &s,SElemType e)//插入新元素e
{
if(s.top-s.base>=s.stacksize)//栈满则追加存储空间
{
s.base=(SElemType*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!s.base)
{
printf("栈满时重新分配空间失败");
exit(-1);
}
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top=e;
s.top++;
}
void Pop(SqStack &s,SElemType &e)//删除栈顶元素并用e返回其值
{
if(StackEmpty(s))
{
printf("栈空\n");
exit (-1);
}
e=*(s.top-1);
s.top--;
}
void Visit(SqStack s)//从栈底到栈顶遍历
{
if(StackEmpty(s))
{
printf("栈空");
exit(-1);
}
SElemType *p=s.base;
while(p!=s.top)
{
printf("%d ",*p);
p++;
}
printf("\n");
}
int main()
{
int e;
SqStack s;
InitStack(s);
Push(s,1);
Push(s,2);
Push(s,3);
Visit(s);
GetTop(s,e);
printf("%d\n",e);
Pop(s,e);
Pop(s,e);
printf("%d\n",e);
ClearStack(s);
Visit(s);
DestoryStack(s);
}