/*
对栈的一些基本操作:
1,栈的创建。 CreatStack(SqStack &s)
2,压栈操作。 Push(SqStack &s,SElemType &e)
3,得到栈顶的元素。 GetTop(SqStack s,SElemType &e)
4,出栈操作。(若栈不为空,则删除栈顶元素,并用e2返回其值) Pop(SqStack &s,SElemType &e)
5,计算栈的长度。 StackLength(SqStack s)
6,清空一个栈。 ClearStack(SqStack &s)
7,销毁一个栈。 DestroyStack(SqStack &s)
8,依次输出栈低到栈顶的元素。PrintSatck(SqStack s)
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100 //栈存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef int Status; //函数类型
typedef int SElemType; //数据元素类型
typedef struct
{
SElemType *top;
SElemType *base;
SElemType stacksize;
}SqStack;
//栈的创建
Status CreatStack(SqStack &s)
{
s.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!s.base) exit(OVERFLOW);
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
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)
exit(OVERFLOW);
s.top = s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top = e;
s.top++;
return OK;
}
//得到栈顶的元素
Status GetTop(SqStack s,SElemType &e)
{
if(s.top == s.base)
return ERROR;
e = *(s.top - 1);
return e;
}
//出栈操作
Status Pop(SqStack &s,SElemType &e)
{
if(s.top == s.base)
return ERROR;
--s.top;
e = *s.top;
return e;
}
//计算栈的长度
Status StackLength(SqStack s)
{
return (s.top - s.base);
}
//清空一个栈
Status ClearStack(SqStack &s)
{
s.top = s.base;
return OK;
}
//销毁一个栈
Status DestroyStack(SqStack &s)
{
int i,len;
len = s.stacksize;
for(i=0;i<len;i++)
{
free(s.base);
s.base++;
}
s.top = s.base = NULL;
s.stacksize = 0;
return OK;
}
//依次输出栈低到栈顶元素
void PrintSatck(SqStack s)
{}
//主函数
int main()
{
SqStack s;
int e;
//调用CreatStack函数,创建一个空栈
CreatStack(s);
printf("栈已创建好!
");
//调用Push函数,进行压栈操作
printf("请输入要压入栈的数据:
");
scanf("%d",&e);
while(e!=9999)
{
Push(s,e);
printf("input data ending(9999)
");
scanf("%d",&e);
}
printf("栈的长度为:%d",StackLength(s));
printf("
");
//调用GetTop函数
printf("栈顶的元素是:%d",GetTop(s,e));
printf("
");
//调用Pop函数,删除栈顶的元素
printf("删除的栈顶的元素是:%d",Pop(s,e));
printf("
");
//调用StackLength函数,计算栈的长度
printf("栈的长度为:%d",StackLength(s));
printf("
");
//调用ClearStack函数,清空一个栈
ClearStack(s);
printf("栈已清空
");
//调用DestroyStack函数,销毁一个栈
//DestroyStack(s);
//printf("栈已销毁
");
//调用PrintStack函数依次输出栈低到栈顶的元素
//PrintStack(s);
//printf("
");
return 0;
}