栈
一、栈的定义
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。将允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为先进后出(Last In First Out)的线性表,简称LIFO结构。
栈的插入叫作进栈,也称压栈、入栈,类似子弹入弹夹;栈的删除叫作出栈,也称弹栈,如同弹夹的子弹出夹。
二、栈的顺序存储结构——顺序栈
1、结构定义
typedef int SElemType;
typedef struct{
SElemType data[MAXSIZE];
int top;
int stacksize;
}SqStack;
2、进栈
/*插入元素e为新的栈顶元素*/
Status Push(SqStack &S, SElemType e){
if(S.top == S.stacksize) return ERROR;//栈满
S.data[S.top++] = e;
return OK;
}
3、出栈
/*删除栈顶元素*/
Status Pop(SqStack &S, SElemType &e){
if(S.top == -1) return ERROR;
e = S.data[S.top--];
return OK;
}
三、栈的链式存储结构——链栈
链栈是不带头节点的单链表
四、两栈共享空间
数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个栈为栈的末端,即下标为数组长度n-1处,这样,两个栈如果增加元素,就是两端点向中间延伸。
1、结构定义
/*两栈共享空间结构*/
typedef struct{
SElemType data[MAXSIZE];
int top1;//栈1栈顶指针
int top2;//栈2栈顶指针
}SqDoubleStack;
/*插入元素e为新的栈顶元素*/
int Push(SqDoubleStack &S, SElemType e, int stackNumber){
if(S.top1 + 1 == S.top2)//栈满
return ERROR;
if(stackNumber == 1)//栈1有元素进栈
S.data[++S.top1] = e;//若栈1则top1+1后给数组元素赋值
else if(stackNumber == 2){
S.data[--S.top2] = e;
}
return OK;
}
int Pop(SqDoubleStack &S, SElemType &e, int stackNumber){
if(stackNumber == 1){
if(S.top1 == -1)
return ERROR;
e = S.data[S.top1--];
}
else if(stackNumber == 2){
if(S.top2 == MAXSIZE)
return ERROR;
e = S.data[S.top2++];
}
return OK;
}