package com.coding.basic.stack; import java.util.EmptyStackException; /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 * @@author zj * */ public class TwoStackInOneArray { Object[] data = new Object[10]; private int index1 = 0; private int index2=data.length-1; /*扩容因子*/ private static final int FACTOR = 10; /** * 向第一个栈中压入元素 * @param o */ public void push1(Object o){ if(index1-1==index2){ grow(); } data[index1++] = o; } /** * 从第一个栈中弹出元素 * @return */ public Object pop1(){ rangeCheck(index1); return data[--index1]; } /** * 获取第一个栈的栈顶元素 * @return */ public Object peek1(){ rangeCheck(index1); int popIndex = index1-1; return data[popIndex]; } /* * 向第二个栈压入元素 */ public void push2(Object o){ if(index2+1==index1){ grow(); } data[index2--] = o; } /** * 从第二个栈弹出元素 * @return */ public Object pop2(){ rangeCheck(index2); return data[++index2]; } /** * 获取第二个栈的栈顶元素 * @return */ public Object peek2(){ rangeCheck(index2); int popIndex = index2+1; return data[popIndex]; } /** * 扩容 */ private void grow(){ //原来数组长度 int origLen = data.length; //扩容后现在的长度 int curLen = origLen+FACTOR; //栈2中数据个数 int num = origLen - index2-1; //新建临时数组 Object[] temp = new Object[curLen]; //将栈1的内容拷贝到新数组中 System.arraycopy(data, 0, temp, 0, index1); //将栈2的内容拷贝到新数组中 System.arraycopy(data, index1, temp,curLen-num , num); //更新index2与数组 this.index2 = curLen-num-1; this.data = temp; } private void rangeCheck(int index){ if(index==0||index == data.length-1){ throw new EmptyStackException(); } } }