问题分析:
在顺序栈的实现中,元素入栈是从下标为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; }