栈的顺序存储结构:
#define STACK_SIZE 10 //存储空间初始分配量
#define STACK_INCREMENT 2 //存储空间分配增量
struck SqStack {//顺序栈
SElemType *base;//在构造之前和摧毁之后,base的值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
};
栈的基本操作:
(1)初始化栈
//构造一个空栈
void 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;//存储空间为初始分配量
}
(2)销毁栈
//销毁栈S,S不再存在
void DestroyStack(SqStack &s){
free(S.base);//释放栈空间
S.top=S.base=NULL;//栈顶、栈底指针均为空
S.stacksize=0;//当前已分配的存储空间为0
}
(3)清空栈
//把栈S置为空栈
void ClearStack(SqStack &S){
S.top=S.base;//栈顶指针指向栈底
}
(4)判断栈是否为空
//若栈S为空栈,则返回TRUE;否则返回FALSE
Status StackEmpty(SqStack S){
if (S.top==S.base)//空栈条件
return TRUE;
else
return fALSE;
}
(5)判断栈的长度
//返回栈S的元素个数,即栈的长度
int StackLength(SqStack S){
return S.top-S.base;
}
(6)获得栈顶元素
//若栈S不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status GetTop(SqStack S,SElemType &e){
if(S.top > S.base){//栈不空
e=*(S.top-1);//将栈顶元素赋值给e
return OK;
}
else
return ERROR;
}
(7)入栈
//插入元素e为栈S新的栈顶元素
void Push(SqStack &S,SElemType e){
if (S.top-S.base==S.stacksize){//栈满
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));//追加存储空间
if(!S.base)//追加存储空间失败,则退出
exit(OVERFLOW);
S.top=S.base+S.stacksize;//修改栈顶指针,指向新的栈顶
S.stacksize+=STACK_INCREMENT; //更新当前已分配的存储空间
}
*(S.top)++=e;//将e入栈,成为新的栈顶元素,栈顶指针上移一个存储单元
}
(8)出栈
//若栈S不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack &S,SElemType &e){
if(S.top==S.base)//栈空
return ERROR;
e= * --S.top;//将栈顶元素赋值给e,栈顶指针下移一个存储单元
return OK;
}
(9)遍历栈
//将栈底到栈顶依次对栈S中每一个元素调用函数visit()
void StackTraverse(SqStack S,void(*visit)(SElemType)){
SElemType * p=S.base;
while(S.top>p)//p指向栈元素
visit(*p++);//对该栈元素调用visit(),p指针上移一个存储单元
printf("\n");
}