想法是stack1,stack2的base分别在数组的两端。
stack1每次push的时候top + 1,stack2每次push时top-1,
初始时top1=base1,top2=base2,判断是否用空余空间可以用stack1.top > stack2.top
pop操作相反,判断栈空可以用stack.base == stack.top
typedef struct{
int left_pos; //左边栈顶,靠0方向
int right_pos; //右边栈顶,靠MAXSIZE-1方向
int split_pos; //左右栈分割位置
int stack[MAXSIZE];
}DoubleStack;
初始的时候,为了能够高效方便的让2个栈进数据,建议把split_pos设置为MAXSIZE/2,也即中间,并初始化 left_pos,right_pos也为MAXSIZE/2;
栈空判断left_pos==split_pos,则左栈空;right_pos==split_pos右栈空
栈非空left_pos < split_pos;right_pos > split_pos
进栈操作:
左:如果left_pos为0;right_pos不为MAXSIZE-1;则把栈所有数据向右移(MAXSIZE-right_pos)/2;
为什么不移1,?是为了效率考虑,比如只移1的话,左边又有一个元素进栈,则还要以一次,效率低下。
右:同左边相同的考虑方案,
一个栈对数组的头操作
一个栈对数组的尾操作
懂了吗?