#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100//初始容量
#define STACKINCREMENT 10//每次增加的容量
typedef struct
{
int *base;//栈底指针
int *top;//栈顶指针
int stacksize;//栈容量
}Sqstack;
int InitStack(Sqstack *L)//创建空栈
{
L->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));//分配基址
if(!L->base)
exit(0);//存储分配失败
L->top=L->base;//空栈
L->stacksize=STACK_INIT_SIZE;//初始容量
return 1;
}
void GetStack(Sqstack *L)//返回栈顶元素
{
int e;
if(L->top==L->base)//栈空
{
printf("栈空,无法返回.\n");
exit(0);
}
else
{
e=*(L->top-1);//栈顶指针的前一个位置即为栈顶元素
printf("栈顶数据为:%d\n",e);
}
}
void Push(Sqstack *L)//插入栈顶元素
{
printf("请输入插入的数据shu:");
int e;
scanf("%d",&e);
if(L->top - L->base>=L->stacksize)//栈满
{
L->base=(int *)realloc(L->base,(L->stacksize+STACKINCREMENT)*sizeof(int));//增加容量
if(!L->base)
exit(0);//存储分配失败
L->top=L->base+L->stacksize;//更新栈顶指针
L->stacksize+=STACKINCREMENT;//更新栈容量
}
*L->top++=e;//栈顶数据变为e
}
void Pop(Sqstack *L)//删除栈顶元素
{
int e;
if(L->top==L->base)//栈空
{
printf("删除有误.\n");
exit(0);
}
else
{
e=*--L->top;
printf("删除数据为:%d\n",e);
}
}
void ShowStack(Sqstack *L)//显示栈
{
printf("栈:");
int *p;
p=L->base;
while(p!=L->top)
{
printf("%d ",*p++);
}
printf("\n");
}
int main()
{
printf("先构造一个空栈.\n");
Sqstack L;
InitStack(&L);
printf("%s",InitStack(&L)?"创建成功.\n":"创建失败.\n");
while(1)
{
printf("你可以进行的操作:\n");
printf("1:返回栈顶元素 2:插入栈顶元素 3:删除栈顶元素 0:退出\n");
printf("请输入你的选择:");
int xuan;
scanf("%d",&xuan);
if(xuan==0)
break;
if(xuan==1)
{
GetStack(&L);
ShowStack(&L);
}
if(xuan==2)
{
Push(&L);
ShowStack(&L);
}
if(xuan==3)
{
Pop(&L);
ShowStack(&L);
}
}
return 0;
}