package com.coding.basic.stack; import java.util.NoSuchElementException; /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 * @author liuxin * */ public class TwoStackInOneArray { Object[] data = new Object[10]; private static final int GROW_UP_SIZE = 100; private int index1 =0; private int index2 = data.length-1; /** * 向第一个栈中压入元素 * @param o */ public void push1(Object o){ if(o!=null){ checkIsMeeting(index1); data[index1++] = o; }else{ throw new NullPointerException(); } } /** * 从第一个栈中弹出元素 * @return */ public Object pop1(){ if(index1==0) throw new NoSuchElementException(); Object first = data[index1-1]; data[index1--] = null; return first; } /** * 获取第一个栈的栈顶元素 * @return */ public Object peek1(){ if(index1==0) throw new NoSuchElementException(); return data[index1-1]; } /* * 向第二个栈压入元素 */ public void push2(Object o){ if(o!=null){ checkIsMeeting(index2); data[index2--] = o; }else{ throw new NoSuchElementException(); } } /** * 从第二个栈弹出元素 * @return */ public Object pop2(){ if(index2==data.length-1) throw new NoSuchElementException(); Object last = data[index2+1]; data[index2++] = null; return last; } /** * 获取第二个栈的栈顶元素 * @return */ public Object peek2(){ if(index2==data.length-1) throw new NoSuchElementException(); return data[index2+1]; } public int getSize(){ System.out.println(index1); System.out.println(index2); return (index1-0)+(data.length-1-index2); } /** * 检查是否碰头 */ private void checkIsMeeting(int index){ if(data[index]!=null){ growUp(); } } /** * 检查数组长度是否越界,越界就自动增长100 */ private void growUp() { Object[] elementGrow = new Object[data.length + GROW_UP_SIZE]; int start = 0; int end = elementGrow.length-1; if(index1!=0) while(data[index1-1]!=null){ elementGrow[start++] = pop1(); } if(index2!=data.length-1) while(data[index2+1]!=null){ elementGrow[end--] = pop2(); } data = elementGrow; index1 = start; index2 = end; } }