public class TwoStack {
private Object[] stack;
private int size1;
private int size2;
public TwoStack(int length){
stack=new Object[length];
size1=0;
size2=length-1;
}
public int size1(){
return size1;
}
public int size2(){
return capacity()-1-size2;
}
public boolean isEmpty1(){
return size1==0;
}
public boolean isEmpty2(){
return size2==(capacity()-1);
}
public int capacity(){
return stack.length;
}
public void ensureCapacity(){
if((size1()+size2())>=capacity()){
Object[] newStack=new Object[capacity()*2];
int k=newStack.length-1;
for (int i = 0; i <size1(); i++) {
newStack[i]=stack[i];
}
for(int j=capacity()-1;j>=0;j--){
newStack[k]=stack[j];
k--;
}
size2=newStack.length-(capacity()-size2);
stack=newStack;
}
}
public void push1(Object obj){
ensureCapacity();
stack[size1]=obj;
size1++;
}
public void push2(Object obj){
ensureCapacity();
stack[size2]=obj;
size2--;
}
public Object pop1(){
if(isEmpty1()){
throw new ArrayIndexOutOfBoundsException("栈1不能为空");
}
Object obj=stack[--size1];
stack[size1]=null;
return obj;
}
public Object pop2(){
if(isEmpty2()){
throw new ArrayIndexOutOfBoundsException("栈2不能为空");
}
Object obj=stack[++size2];
stack[size2]=null;
return obj;
}
}