#include<stdio.h> //用数组创建栈
#include<stdlib.h>
#define stack_init_size 100
#define stack_newlenth 100 //新增加的长度
struct stack{
int size;
int *top;
int *base;
}s;
void initstack() //初始化栈
{
s.base=(int *)malloc(stack_init_size * sizeof(int)); //s.base 指向的地址大小为层数*int字节数
if(!s.base) //如果s.base为空,则分配失败。正常应该存地址
printf("分配空间失败");
s.top=s.base; //注意不能赋反
s.size=stack_init_size;
}
int is_empty() //判断栈是否为空
{
if(s.base==s.top)
return 1;
else
return 0;
}
void push(int i) //入栈
{
if(s.top-s.base>=s.size)
{
s.base=(int *)realloc(s.base,(stack_init_size+stack_newlenth)*sizeof(int));
if(!s.base) //如果内存满,重新分配。如果分配的内存被占用,则realloc函数自动复制所有值重新寻找新的空间
printf("重新分配失败");
s.top=s.base+s.size;
s.size=stack_init_size+stack_newlenth;
}
*s.top=i;
s.top++;
}
int out() //出栈
{
int e;
if(is_empty() )
return 0;
s.top--;
e=*s.top;
return e;
}
int gettop() //栈顶元素
{
int num;
if(is_empty())
{
printf("impossible!");
return 0;
}
num=*(s.top-1);
return num;
}
int main()
{
int n,i,x,j,k,q;
printf("输入入栈次数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("输入操作数:");
scanf("%d",&x);
if(x==1)
{
scanf("%d",&j);
push(j);
}
else if( x==2)
{ k=out();
if(k)
k;
else
{
printf("impossible!"); //如果栈为空就不能再出战,程序结束
return 0;
}
}
else if(x==3)
{
q=gettop();
if(q)
{
printf("栈顶元素为:");
printf("%d\n",q);
}
else
return 0; //如果栈为空,则查看不了栈顶元素,程序结束;
}
}
return 0;
}
//其次还有清空栈和销毁栈
//清空就是让s.top==s.base
//销毁就是free(s.base);