package com.aaront.exercise.basic; /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 */ public class TwoStackInOneArray { private Object[] data = new Object[10]; private int pos1 = -1; private int pos2 = data.length; /** * 向第一个栈中压入元素 * * @param o */ public void push1(Object o) { _ensureCapacityEnough(); data[++pos1] = o; } /** * 从第一个栈中弹出元素 * * @return */ public Object pop1() { if (pos1 < 0) return null; return data[pos1--]; } /** * 获取第一个栈的栈顶元素 * * @return */ public Object peek1() { if (pos1 < 0) return null; return data[pos1]; } /* * 向第二个栈压入元素 */ public void push2(Object o) { _ensureCapacityEnough(); data[--pos2] = o; } /** * 从第二个栈弹出元素 * * @return */ public Object pop2() { if (pos2 >= data.length) return null; return data[pos2++]; } /** * 获取第二个栈的栈顶元素 * * @return */ public Object peek2() { if (pos2 >= data.length) return null; return data[pos2]; } private void _ensureCapacityEnough() { if (pos1 + 1 == pos2) { _dilatancy(); } } private void _dilatancy() { Object[] temp = new Object[data.length * 2]; for (int i = 0; i <= pos1; i++) { temp[i] = data[i]; } for (int i = pos2; i < data.length; i++) { temp[temp.length - (data.length - i)] = data[i]; } pos2 = temp.length - (data.length - pos2); data = temp; } }