package datastructure.stack; import java.util.Arrays; /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 * @author liuxin * */ public class TwoStackInOneArray { Object[] data = new Object[10]; private int index1 = 0; private int index2 = data.length - 1; /** * 向第一个栈中压入元素 * @param o */ public void push1(Object o){ ensureCapacity(); data[index1++] = o; } private void ensureCapacity() { if (isFull()) { grow(); } } private boolean isFull() { return index1 + 1 == index2; } private void grow() { int stack2Length = data.length - 1 - index2; data = Arrays.copyOf(data, data.length * 2); int oldIndex2 = index2; index2 = data.length - stack2Length - 1; System.arraycopy(data, oldIndex2 + 1, data, index2 + 1, stack2Length); } /** * 从第一个栈中弹出元素 * @return */ public Object pop1(){ return data[--index1]; } /** * 获取第一个栈的栈顶元素 * @return */ public Object peek1(){ return data[index1 - 1]; } /** * 向第二个栈压入元素 */ public void push2(Object o){ ensureCapacity(); data[index2--] = o; } /** * 从第二个栈弹出元素 * @return */ public Object pop2(){ return data[++index2]; } /** * 获取第二个栈的栈顶元素 * @return */ public Object peek2(){ return data[index2 + 1]; } }