共享栈:
利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
连个栈的栈顶指针都指向栈顶元素,top0=-1时,0号占位空,top1=MaxSize-1时1号栈为空;
仅当两个栈顶指针相邻(top1-top0=1)时,判断为栈满。当0号栈进栈时,top0先加1,在赋值,1号栈进栈时top1先减去1在赋值;出栈时刚刚相反。
共享栈时为了有效利用存储空间,两个栈的空间相互调节,只在整个存储空间被占满菜发生上溢。
代码如下:
typedef struct
{
SElemType data[MAXSIZE];
int top1;
int top2;
} SqDoubleStack;
Status Push(SqDoubleStack *S,SElemType e,int stackNumber)
{
if(S->top1+1==S->top2)
return ERROR;
if(stackNumber==1)
S->data[++S->top1]=e;
else if(stackNumber==2)
S->data[--S->top2]=e;
return OK;
}
在大话数据结构中如此描述
他们是在数组的两端,向中间靠拢,top1和top2是两个栈的栈顶指针,只要这两个不见面,两个栈就能使用。栈1空是,top1==-1,top2==n时,栈2为空。
栈满的情况:
若栈2空,top1 == n - 1,栈1满;栈1空,top2==0,栈2满;更多的情况是top1+1 == top2为栈满。
链栈:
用数组存储栈会出现栈满的情况而对于链栈来说不存在这种情况。
链栈的结构代码如下:
typedef struct StackNode
{
int data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
入栈:
int push(SqStack *s,int e)
{
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data;
s->next=s->top;
s->top=s;
s->count++;
return success;
}
出栈:
int pop(SqStack *s,int *e)
{
LinkstackPtr p;
if(StackEmpty(*s))
{
return error;
}
*e=s->top->data;
p=s->top;
s->top=s->top->next;
free(p);
s->count--;
return success;
}