问题分析:
在顺序栈的实现中,元素入栈是从下标为0的位置向上增长的,出栈是通过size--实现的。要想用一个数组实现2个栈,可以除了下标从0开始增长,还同时让另一个栈下标从size-1处开始减少。
问题解决:
定义top1,top2分别代表2个栈栈顶的下一个位置的下标。栈1入栈时,元素放入top1位置,再使top1++;栈2入栈时,元素放入top2位置,再使top2--。出栈时,栈1 top1--;栈2 投top2 ++。
代码实现:
//共享栈
#define size 10
typedef struct sharedstack
{
StackType data[size];
size_t top1;
size_t top2;
}sharedstack;
void InitShared(sharedstack* s);
void PushShared1(sharedstack* s, StackType elem);
void PushShared2(sharedstack* s, StackType elem);
void PopShared1(sharedstack*s);
void PopShared2(sharedstack*s);
int TopShared1(sharedstack* s, StackType* top);
int TopShared2(sharedstack* s, StackType* top);
void InitShared(sharedstack* s)
{
assert(s);
s->top1 = 0;
s->top2 = size-1;
return;
}
void PushShared1(sharedstack* s, StackType elem)
{
assert(s);
if(s->top1 > s->top2)
return;
s->data[s->top1++] = elem;
return;
}
void PushShared2(sharedstack* s, StackType elem)
{
assert(s);
if(s->top1 > s->top2)
return;
s->data[s->top2--] = elem;
return;
}
void PopShared1(sharedstack*s)
{
assert(s);
if(s->top1 == 0)
return;
--s->top1;
return;
}
void PopShared2(sharedstack*s)
{
assert(s);
if(s->top2 == size-1)
return;
++s->top2;
return;
}
int TopShared1(sharedstack* s, StackType* top)
{
assert(s);
assert(top);
if(s->top1 == 0)
return 0;
*top = s->data[s->top1-1];
return 1;
}
int TopShared2(sharedstack* s, StackType* top)
{
assert(s);
assert(top);
if(s->top2 == size-1)
return 0;
*top = s->data[s->top2 +1];
return 1;
}