好像有点小问题
#include <stdio.h>
#include <malloc.h>
typedef int SElemType;
typedef int Status;
#define INIT_SIZE 100
#define STACKINCREMENT 10
#define Ok 1
#define Error 0
#define True 1
#define False 0
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化栈
Status InitStack(SqStack *s)
{
s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
if(!s->base)
{
puts("存储空间分配失败!");
return Error;
}
s->top = s->base;
s->stacksize = INIT_SIZE;
return Ok;
}
//清空栈
Status ClearStack(SqStack *s)
{
s->top = s->base;
return Ok;
}
//栈是否为空
Status StackEmpty(SqStack *s)
{
if(s->top == s->base)
return True;
else
return False;
}
//销毁栈
Status Destroy(SqStack *s)
{
free(s->base);
s->base = NULL;
s->top = NULL;
s->stacksize=0;
return Ok;
}
//获得栈顶元素
Status GetTop(SqStack *s, SElemType &e)
{
if(s->top == s->base) return Error;
e = *(s->top - 1);
return Ok;
}
//压栈
Status Push(SqStack *s, SElemType e)
{
if(s->top - s->base >= s->stacksize)//栈满
{
s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!s->base)
{
puts("存储空间分配失败!");
return Error;
}
s->top = s->base + s->stacksize;//修改栈顶位置
s->stacksize += STACKINCREMENT;//修改栈长度
}
*s->top++ = e;
return Ok;
}
//弹栈
Status Pop(SqStack *s, SElemType *e)
{
if(s->top == s->base) return Error;
--s->top;
*e = *(s->top);
return Ok;
}
//遍历栈
Status StackTraverse(SqStack *s,Status(*visit)(SElemType))
{
SElemType *b = s->base;//此处不能直接用base或top移动,即不能改变原栈的结构
SElemType *t = s->top;
while(t > b)
visit(*b++);
printf("\n");
return Ok;
}
Status visit(SElemType c)
{
printf("%d ",c);
return Ok;
}
int main()
{
SqStack a;
SqStack *s = &a;
SElemType e;
printf("构造一个空栈……\n");
InitStack(s);
int n;
puts("请输入要进栈的个数:");
scanf("%d", &n);
printf("请输入进栈元素:");
while(n--)
{
int m;
scanf("%d", &m);
Push(s, m);
}
printf("……本栈是空栈吗??……\n");
if (StackEmpty(s) )
printf("YES !!!\n");
else
printf("NO !!!\n");
printf("遍历输出栈中的所有元素:\n");
StackTraverse(s,visit);
printf("\n");
printf("……输出栈顶元素……\n");
e = GetTop(s, e);
printf("栈顶元素是:\n");
printf("%d\n",e);
printf("……栈顶插入元素……\n");
printf("请输入要插入的元素的数值:\n");
scanf("%d",&e);
Push(s,e);
printf("现在栈中的元素是:\n");
StackTraverse(s,visit);
printf("\n");
printf("……栈顶删除元素……\n");
printf("删除的元素是:\n");
scanf("%d",&e);
StackTraverse(s, visit);
puts("");
Pop(s, &e);
printf("现在栈中的元素是:\n");
StackTraverse(s,visit);
printf("\n");
printf("……销毁栈……\n");
if(Destroy(s))
printf("销毁栈成功\n");
else
printf("销毁栈失败\n");
printf("……清空栈……\n");
if((ClearStack(s)))
printf("清空栈成功\n");
else
printf("清空栈失败\n");
printf("您已经成功完成所有的功能!!!\n");
/*
SqStack a;
SqStack *s = &a;
SElemType e;
InitStack(s);
int n;
puts("请输入要进栈的个数:");
scanf("%d", &n);
while(n--)
{
int m;
scanf("%d", &m);
Push(s, m);
}
StackTraverse(s, visit);
puts("");
puts("8进栈后:");
Push(s, 8);
StackTraverse(s, visit);
puts("");
Pop(s, &e);
printf("出栈的元素是:%d\n", e);
printf("元素出栈后事实上并没有清除,依然存在于内存空间,所谓的出栈只是指针移动,出栈的元素是%d\n", *s->top);//判断出栈后元素是否还存在于内存中
Destroy(s);
*/
return 0;
}