栈:后进先出。(LIFO结构)
栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。
功能:用于浏览器的后退操作,以及word等软件的撤销操作。
两栈共享空间,用一个数组来存储两个栈。
/*两栈共享空间结构*/
typedef struct
{
SElemType data[MAXSIZE];
int top1; /*栈1栈顶指针*/
int top2; /*栈2栈顶指针*/
}SqDoubleStack;
对于两栈共享空间的Push方法,除了要插入元素值参数外,还需要有一个判断是栈1还是栈2的栈号参数 stackNumber:
/*插入元素e为新的栈顶元素*/
Status Push(SqDoubleStack *S,SElemType e,int stackNumber)
{
if(S->top1+1==S->top2) /*栈已满,不能再push新元素了*/
return ERROR;
if(stackNumber==1) /*栈1有元素进栈*/
S->data[++S->top1]=e; /*若栈1则先top1+1后给数组元素赋值*/
else if(stackNumber==2) /*栈2有元素进栈*/
S->data[--S->top2]=e; /*若栈2则先top2-1后给元素赋值*/
return OK;
}
因为在开始已经判断了是否有栈满的情况,所以后面的top1+1或top2-1是不担心溢出问题的。对于两栈共享空间的Pop方法,参数就只是判断栈1 栈2的参数stackNumber:
/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber)
{
if(stackNumber==1)
{
if(S->top1==1)
return ERROR; /*说明栈1已经是空栈,溢出*/
*e=S->data[S->top1--]; /*将栈1的栈顶元素出栈*/
}
else if(stackNumber==2)
{
if(S->top2==MAXSIZE)
return ERROR; /*说明栈2已经是空栈,溢出*/
*e=S->data[S->top2++]; /*将栈2的栈顶元素出栈
}
return OK;
}