package stack;
import java.util.Arrays;
import java.util.NoSuchElementException;
/**
* 用一个数组实现两个栈
* 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
* @author liuxin
*
*/
public class TwoStackInOneArray {
Object[] data = new Object[10];
private int size1 = 0;
private int size2 = 0;
/**
* 向第一个栈中压入元素
* @param o
*/
public void push1(Object o){
checkCapacity();
data[size1++] = o;
}
@Override
public String toString() {
return "TwoStackInOneArray [data=" + Arrays.toString(data) + "]";
}
public int size1() {
return size1;
}
public int size2() {
return size2;
}
private void checkCapacity() {
if (size() + 1 >= data.length) {
grow();
}
}
private int size() {
return size1 + size2;
}
private void grow() {
int newCapacity = size() * 2;
Object[] target = new Object[newCapacity];
System.arraycopy(data, 0, target, 0, size1);
System.arraycopy(data, data.length - size2, target, target.length - size2, size2);
data = target;
}
/**
* 从第一个栈中弹出元素
* @return
*/
public Object pop1(){
checkEmpty(size1);
Object o = data[size1-1];
data[size1-1] = null;
size1--;
return o;
}
private void checkEmpty(int size) {
if (size <= 0) {
throw new NoSuchElementException("stack is empty");
}
}
/**
* 获取第一个栈的栈顶元素
* @return
*/
public Object peek1(){
checkEmpty(size1);
return data[size1-1];
}
/*
* 向第二个栈压入元素
*/
public void push2(Object o){
checkCapacity();
data[data.length - size2 - 1] = o;
size2++;
}
/**
* 从第二个栈弹出元素
* @return
*/
public Object pop2(){
checkEmpty(size2);
Object o = data[data.length - size2];
data[data.length - size2] = null;
size2--;
return o;
}
/**
* 获取第二个栈的栈顶元素
* @return
*/
public Object peek2(){
checkEmpty(size2);
return data[data.length - size2];
}
}