概念
限定插入和删除只能在表的端点进行的线性表
越靠后进入的越先出来
表尾(an端)称之为栈顶Top,表头(a1端)称之为栈底Base
插入元素到栈顶为入栈Push,从栈顶删除最后一个元素称之为出栈Pop
typedef struct { //顺序栈
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
typedef struct StackNode{ //链栈
ElemType data;
struct StackNode *next;
}StackNode, *LinkStack;
栈空时出栈,则下溢。栈满时入栈,则上溢。
基本操作
顺序栈的初始化
Status InitStack(SqStack *s){
s->base=(ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
if(s->base==NULL){
return OVERFLOW;
}
s->base=s->top;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
顺序栈的出栈
Status Pop(SqStack *s,ElemType *e){
if(s->base==s->top){
return ERROR; //栈空
}
e=*(--s->top);
return OK;
}
顺序栈的入栈
Status Push(SqStack *s,ElemType e){
if(s->top-s->base==s->stacksize){ //栈满
return ERROR;
}
*(s->top++)=e;
return OK;
}
顺序栈获取栈顶元素
Status GetTop(SqStack S, ElemType e){
//若栈不空,则用e返回S的栈顶元素,并返回OK
if (S.top == S.base){ // 空栈
return ERROR;
}
e = *(S.top-1); //返回非空栈中栈顶元素
return OK;
} //GetTop
链栈的出栈
Status push_L(LinkStack *S,ElemType e){
LinkStack p;
p=(LinkStack *)malloc(sizeof(StackNode));
p->data=e;
p->next=*S;
*S=p; //修改栈顶元素
}
链栈的入栈
Status pop_l(LinkStack *S,ElemType *e){
LinkStack p=*S;
*e=(*S)->data;
*S=(*S)->next;
free(p);
return OK;
}