3.1栈的定义和顺序栈
顺序栈类型声明
//LIFO / FILO
#define STACK_INIT_SIZE 100//存储空间初始化分配量
#define STACK_INCREMENT 10//存储空间分配增量
typedef char ElemType;
typedef struct {
ElemType *base;//栈底指针
ElemType *top;//栈顶指针
int stacksize;//栈空间大小
}SqStack;
栈顶元素和栈顶指针top之间总是相差一个元素
栈空条件:S.top == S.base
栈满条件:S.top-S.base >= S.stacksize
元素e进栈操作:*(S.top)++ = e
出栈元素e操作:e = *--S.top
//IniStack(S)
//初始化栈算法
void InitStack(SqStack &S) {
//构造一个空栈S
if(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType))))
exit(OVERFLOW); //存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
//销毁栈算法
void Destroy(SqStack &S) {
//销毁S,S不再存在
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
//如果不置空三个变量,会发生什么问题???
}
//Push
//进栈算法
void Push(SqStack &S,ElemType e) {
if(S.top - S.base >= S.stacksize) { //栈满,追加存储空间
S.base = (ElemType *)realloc(S.base,(S.stacksize + STACK_INCREMENT) * sizeof(ElemType));//realloc追加开辟空间
if(!S.base)
exit(OVERFLOW); //存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACK_INCREMENT;
}
*(S.top)++ = e;
}
//Pop
//出栈算法
Status Pop(SqStack &S,ElemType &e) {
//若栈不空,则删除S的栈顶元素,用e返回其值
//否则返回ERROR
if(S.top == S.base)
return ERROR;
e = *--S.top;
return OK;
}
//取栈顶元素算法
Status GetTop(SqStack &S,ElemType &e) {
//若栈不为空,则用e返回S的栈顶元素,并返回OK
//否则返回ERROR
if(S.top > S.base) {
e = *(S.top - 1);
return OK;
}
else
return ERROR;
}
//判断栈空算法
Status StackEmpty(SqStack S) {
//若栈S为空栈,则返回TRUE,否则返回FALSE
if(S.top == S.base)
return TRUE;
else
return FALSE;
}