数据结构之栈的实现代码如下:
//=====================================================================================
//sheadd.h
#define TRUE
1
#define FALSE
0
#define OK
1
//成功
#define ERROR
0
//失败(错误)
#define INFEASIBLE
-1
//不可行的
#define OVERFLOW
-2
//(内存)溢出
#define UNDERFLOW
-4
//(数组下标)下溢
#define ENDELEM
-9999
//序列结束元素(为方便演示而设)
#define STACK_INIT_SIZE 20
// 存储空间初始分配量
#define STACKINCREMENT 2
// 存储空间分配增量
typedef int SElemType;
//
定义栈元素类型
typedef int Status;
//定义类型int为Status,即给int取一别名Status
struct SqStack
{
SElemType *base;
//
在栈构造之前和销毁之后,base的值为NULL
SElemType *top;
//
栈顶指针
int stacksize;
// 当前已分配的存储空间,以元素为单位
}; // 顺序栈
//================================================================================
//=================================================================================
#include
#include
#include "sheadd.h"
Status InitStack(SqStack &S)
{
//
构造一个空栈S
if(!(S.base=(SElemType
*)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
exit(OVERFLOW); // 存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
//stacksize指示栈的大小
return OK;
}
Status DestroyStack(SqStack &S)
{ // 销毁栈S,S不再存在
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
return OK;
}
Status ClearStack(SqStack &S)
{ // 把S置为空栈,不删除元素
S.top=S.base;
return OK;
}
Status StackEmpty(SqStack S)
{ // 若栈S为空栈,则返回TRUE,否则返回FALSE
if(S.top==S.base)
return
TRUE;
else
return
FALSE;
}
int StackLength(SqStack S)
{ // 返回S的元素个数,即栈的长度
return
S.top-S.base;
}
Status GetTop(SqStack S,SElemType
&e)
{ // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top>S.base)
{
e=*(S.top-1);
//top指向栈顶元素的上一个
return
OK;
}
else
return
ERROR;
}
Status Push(SqStack &S,SElemType
e)
{ // 插入元素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;
return OK;
}
Status Pop(SqStack &S,SElemType
&e)
{ //
若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top==S.base)
return
ERROR;
e=*--S.top;
return OK;
}
Status
StackTraverse(SqStack S,Status(*visit)(SElemType))
{ // 从栈底到栈顶依次对栈中每个元素调用函数visit()。
//
一旦visit()失败,则操作失败
while(S.top>
S.base)
visit(*S.base++);
printf("\n");
return OK;
}
Status visit(SElemType c)
{
printf("%d ",c);
return OK;
}
void main()
{
int j;
SqStack s;
SElemType e;
if(InitStack(s)==OK)
for(j=1;j<= 12;j++)
Push(s,j);
printf("栈中元素依次为:");
StackTraverse(s,visit);
Pop(s,e);
printf("弹出的栈顶元素
e=%d\n",e);
printf("栈空否:%d(1:空
0:否)\n",StackEmpty(s));
GetTop(s,e);
printf("栈顶元素 e=%d
栈的长度为%d\n",e,StackLength(s));
ClearStack(s);
printf("清空栈后,栈空否:%d(1:空
0:否)\n",StackEmpty(s));
DestroyStack(s);
printf("销毁栈后,s.top=%u
s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
}
//====================================================================================