注意:记得自己每次写完一个函数库后,都要和别人的进行对比,取其长处,补己之短,使自己的代码更加完善和健壮
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.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 Stack
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化与销毁
Status InitStack(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 DestroyStack(SqStack &S)
{
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
return OK;
}
//清空栈
Status ClearStack(SqStack &S)
{
S.top=S.base;//保留首地址
return OK;
}
//入栈
Status Push(SqStack &S,SElemType e)
//插入e为栈顶元素
{
if(S.top-S.base==S.stacksize)//栈满重新开辟空间
{
S.base=(SElemType*)realloc(S.base,(STACKINCREMENT+S.stacksize)*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top=(S.base+S.stacksize);
S.stacksize=S.stacksize+STACKINCREMENT;
}
*S.top=e;
S.top++;
return OK;
}
//出栈
Status Pop(SqStack &S,SElemType &e)
{
if(S.base==S.top) return ERROR;
e=*(S.top-1);
S.top--;
return OK;
}
//判栈空
Status StackEmpty(SqStack &S)
{
if(S.top==S.base)//空栈
{
return TRUE;
}
else return FALSE;
}
//求栈长
int StackLength (SqStack S)
{
int i=0;
SElemType *p;
p=S.top;
while(p!=S.base)
{
p--;i++;
}
return i;
}
//遍历栈
Status StackTraverse(SqStack S,Status (*visit)(SElemType))
{
SElemType *p;
p=S.base;
while(p<S.top)
{
if(visit(*p)==ERROR)return ERROR;
p++;
}
return OK;
}
Status StackPrintElem(SElemType e)
{
printf("%d\n",e);
return OK;
}
SElemType Gettop(SqStack &S)
{
//if(S.top!=S.base)
//return *(S.top-1); //有隐患对异常情况未作处理
if(S.top==S.base)
return ERROR;
else
return *(S.top-1);
}
//修改栈顶元素的值
Status SetTopElem(SqStack &S,SElemType e)
{
if(S.base==S.top)
{
return ERROR;
}
*(S.top-1)=e;
return OK;
}
int main(){
SqStack s;
SElemType e;
InitStack(s);
Push(s,1);
Push(s,2);
Push(s,3);
StackEmpty(s);
StackLength(s);
StackTraverse(s,StackPrintElem);
Pop(s,e);
SElemType a=Gettop(s);
printf("%d\n",a);
SetTopElem(s,4);
StackTraverse(s,StackPrintElem);
ClearStack(s);
DestroyStack(s);
return 0;
}
路漫漫其修远兮,吾将上下而求索
加油奥里给!