#define STACK_INIT_SIZE 3
#define STACK_INCREAMENT 2
#define null 0
#include <stdio.h>
#include <alloc.h>
typedef struct stack{
int *base;
int *top;
int size;//当前已非配的空间,没数据也算
}Sqstack;//用作堆栈的指针de 类型
void Initstack(Sqstack &s)//建立堆栈
{
s.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(s.base==null)
{
printf("overflow");
}
s.top=s.base;
s.size=STACK_INIT_SIZE;
}
void Gettop(Sqstack &s,int &e)
{
if(s.top==s.base){printf("stack is empty");}
e=*(s.top-1);//注意哦,有一个元素时top指向第二隔了,没改变TOP的指向
}
void Push(Sqstack &s,int e)
{
if((s.top-s.base)+1==s.size)//堆栈满了
{
s.base=(int*)realloc(s.base,(s.size+STACK_INCREAMENT)*sizeof(int));
//仍然以源地址为基地址,从。size后续补充increase
if(s.base==null)
{
printf("overflow");
}
s.top=s.base+s.size-1;
s.size+=STACK_INCREAMENT;printf("我加了\n");
}
*(s.top++)=e;
}
void Pop(Sqstack &s,int &e)
{
if(s.top==s.base){printf("stack is empty");}
e=*(--s.top);
}
void Show(Sqstack &s)
{
int i=0;
for(i=0;i<(s.top-s.base);i++)
printf("%d ",*(s.base+i));
}
int main()
{
Sqstack s;
Initstack(s);
int a,e;
while(a!=0)
{
printf("选择操作1:Gettop 2:Push 3:Pop 4:Show\n");
scanf("%d",&a);
switch(a)
{
case 1:Gettop(s,e);printf("栈顶元素是%d\n",e);break;
case 2:printf("输入进站元素\n");scanf("%d",&e);Push(s,e);break;
case 3:Pop(s,e);printf("出栈元素是%d\n",e);break;
case 4:Show(s);printf("\n");break;
}
}
return 0;
}
评论