package week09.stack;
import java.util.Arrays;
/**
* 用一个数组实现两个栈 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
*
* @author Hui Zhou
*
*/
public class TwoStackInOneArray {
Object[] data = new Object[10];
int i = 0;
int j = data.length - 1;
/**
* 向第一个栈中压入元素
*
* @param o
*/
public void push1(Object o) {
if (i < j) {
data[i++] = o;
} else {
addCapacity();
data[i++] = o;
}
}
private void addCapacity() {
int oldCapacity = data.length;
int newCapacity = oldCapacity + (oldCapacity >> 2);
Object[] tempPre = Arrays.copyOfRange(data, 0, i);
Object[] tempPost = Arrays.copyOfRange(data, j + 1, data.length);
data = Arrays.copyOf(tempPre, newCapacity);
System.arraycopy(tempPost, 0, data, data.length - tempPost.length, tempPost.length);
j = data.length - tempPost.length - 1;
}
/**
* 从第一个栈中弹出元素
*
* @return
*/
public Object pop1() {
if (i <= 0) {
throw new RuntimeException("stack1 is empty.");
}
Object pop1Value = data[--i];
data[i] = null;
return pop1Value;
}
/**
* 获取第一个栈的栈顶元素
*
* @return
*/
public Object peek1() {
return data[i - 1];
}
/*
* 向第二个栈压入元素
*/
public void push2(Object o) {
if (j > i) {
data[j--] = o;
} else {
addCapacity();
data[j--] = o;
}
}
/**
* 从第二个栈弹出元素
*
* @return
*/
public Object pop2() {
if (j >= data.length - 1) {
throw new RuntimeException("stack2 is empty.");
}
Object pop2Value = data[++j];
data[j] = null;
return pop2Value;
}
/**
* 获取第二个栈的栈顶元素
*
* @return
*/
public Object peek2() {
return data[j + 1];
}
}