#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;
}

评论