stack.h
#ifndef _STACK_H_
#define _STACK_H_
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100 // 栈储存空间的初始分配量
#define STACKINCREMENT 10 // 储存空间分配增量
typedef int Status
typedef char SElemType
typedef struct {
SElemType *base;// 储存数据元素的数组
SElemType *top; // 栈顶指针
int stacksize; // 当前分配的栈空间大小,以sizeof(SElemType)为单位
}SqStack;
//** 构造一个空栈
Status InitStack(SqStack *S);
//** 销毁栈
Status DestroyStack(SqStack *S);
//** 栈是否为空
Status StackEmpty(SqStack *S);
//** 入栈
Status Push(SqStack *S,SElemType e);
//**取栈顶
SElemType GetTop(SqStack *S);
//** 出栈
SElemType Pop(SqStack *S);
//** 栈长度
int StackLength(SqStack *S);
//** 遍历
Status StackTraverse(SqStack *S,Status( *visit)(SElemType)); Status visit(SElemType e);
#endif
stack.c
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include"stack.h"
/*********************************************** ************************************************/
int main(int argc,char* argv[])
{
SqStack S; //=(SqStack *)malloc(sizeof(SqStack));
printf("(1)初始化顺序栈。
\n");
InitStack(&S);
return 0;
}
//构造一个空栈S
Status InitStack(SqStack *S)
{
S->base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!s->base)
{
printf("init error!\n");
exit(OVERFLOW);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
printf("init OK\n");
return OK;
}
//销毁栈S
Status DestroyStack (SqStack *S) {
free(S->base);
//free(S->top);
S->base=NULL;
S->top=NULL;
S->stacksize=0;
return OK;
}
//判断栈S是否为空
Status StackEmpty (SqStack *S) {
if(S->base==S->top)
return TRUE;
else
return FALSE;
}
//入栈
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)
{
printf("malloc error when push\n");
exit(OVERFLOW);
}
S->top=S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++=e;
return OK;
}
//** 取栈顶元素,不删除
SElemType GetTop (SqStack *S)
if(S->top==S->base) return ERROR;
//e = S->top-1;
return *(S->top-1);
}
//**栈长度
int StackLength (SqStack *S)
{
//返回S的元素个数,即栈的长度
return (S->top - S->base);
}
//** 出栈(弹出一个)
SElemType Pop (SqStack *S)
{
//若栈不空,则删除S的栈顶元素
if (S->top==S->base) return ERROR;
return (*--S->top);
//** 遍历栈
Status StackTraverse (SqStack s,Status( *visit)(SElemType)) {
while (S.top!=S.base)
visit(*--S.top); //加了个*号
return OK;
}
Status visit(SElemType e)
{
printf("%c\n",e);
return OK;
}。