package basic.dataStructure.stack; /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底, * 压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 * * @author liuxin */ public class TwoStackInOneArray { Object[] data = new Object[10]; private int index1 = 0; private int index2 = 9; private int size1 = 0; private int size2 = 0; /** * 向第一个栈中压入元素 * * @param o */ public void push1(Object o) { data[index1] = o; this.index1++; this.size1 += 1; if (size1 + size2 >= data.length) extend(); } /** * 从第一个栈中弹出元素 * * @return */ public Object pop1() { int index = index1 - 1; Object obj = data[index]; //直接置空 data[index] = null; this.index1 = index; this.size1--; return obj; } /** * 获取第一个栈的栈顶元素 * * @return */ public Object peek1() { int index = index1 - 1; Object obj = data[index]; return obj; } /* * 向第二个栈压入元素 */ public void push2(Object o) { data[index2] = o; index2--; this.size2 += 1; if (size1 + size2 >= data.length) extend(); } /** * 从第二个栈弹出元素 * * @return */ public Object pop2() { int index = index2 + 1; Object obj = data[index]; data[index] = null; this.index2 = index; this.size2--; return obj; } /** * 获取第二个栈的栈顶元素 * * @return */ public Object peek2() { int index = index2 + 1; Object obj = data[index]; return obj; } public int size1() { return this.size1; } public int size2() { return this.size2; } /** * 扩容 */ private void extend() { int size = data.length; int extendSize = 10; Object[] extended = new Object[size + extendSize]; //stack1 //因为指针在数据添加后已经加上了,所以要减回去 for (int i = 0; i <= index1 - 1; i++) { extended[i] = data[i]; } //stack2 //因为指针在添加后已经减掉了1,所以要加回去 for (int i = index2 + 1; i <= size - 1; i++) { int index = i + extendSize; extended[index] = data[i]; } this.data = extended; this.index2 += extendSize; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("stack1 -> ["); for (int i = index1 - 1; i >= 0; i--) { sb.append(data[i]); if (i == 0) { sb.append("]"); } else { sb.append(","); } } sb.append("\nstack2 -> ["); int length = data.length; for (int i = index2 + 1; i < length; i++) { sb.append(data[i]); if (i == length - 1){ sb.append("]"); } else { sb.append(","); } } return sb.toString(); } }