package week09.basic;
import java.util.Arrays;
import java.util.EmptyStackException;
/**
* 用一个数组实现两个栈
* 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
* @author gallenzhang
*
*/
public class TwoStackInOneArray {
private int DEFAULT_SIZE = 10;
Object[] data = null;
private int size1;
private int size2;
public TwoStackInOneArray(int size){
if(size <= 0){
throw new IllegalArgumentException("size can not be negative or zero");
}
data = new Object[size];
}
public TwoStackInOneArray(){
data = new Object[DEFAULT_SIZE];
}
/**
* 向第一个栈中压入元素
*
* @param o
*/
public void push1(Object o) {
ensureCapacity(size1 + size2 + 1);
data[size1] = o;
size1 ++;
}
/**
* 从第一个栈中弹出元素
*
* @return
*/
public Object pop1() {
checkStack1Empty();
Object obj = data[size1 - 1];
data[size1 - 1] = null;
size1--;
return obj;
}
/**
* 获取第一个栈的栈顶元素
*
* @return
*/
public Object peek1() {
checkStack1Empty();
return data[size1-1];
}
/**
* 第一个栈是否为空
* @return
*/
public boolean isStack1Empty(){
return size1 == 0 ;
}
/**
* 获取第一个栈的大小
* @return
*/
public int size1(){
return size1;
}
/*
* 向第二个栈压入元素
*/
public void push2(Object o) {
ensureCapacity(size1 + size2 + 1);
data[data.length - size2 - 1] = o;
size2 ++;
}
/**
* 从第二个栈弹出元素
*
* @return
*/
public Object pop2() {
checkStack2Empty();
Object obj = data[data.length - size2];
data[data.length - size2] = null;
size2 --;
return obj;
}
/**
* 获取第二个栈的栈顶元素
*
* @return
*/
public Object peek2() {
checkStack2Empty();
if(size2 == 0){
throw new EmptyStackException();
}
return data[data.length - size2];
}
public boolean isStack2Empty(){
return size2 == 0 ;
}
public int size2(){
return size2;
}
private void ensureCapacity(int minCapacity){
int capacity = data.length;
if (minCapacity > capacity) {
capacity += capacity / 2;
grow(capacity);
}
}
private void checkStack1Empty(){
if(size1 == 0){
throw new EmptyStackException();
}
}
private void checkStack2Empty(){
if(size2 == 0){
throw new EmptyStackException();
}
}
private void grow(int capacity){
data = Arrays.copyOf(data, capacity);
System.arraycopy(data, size1, data, data.length - size2, size2);
for(int i = size1; i < data.length - size2;i++){
data[i] = null;
}
}
@Override
public String toString(){
StringBuffer sb = new StringBuffer("[");
for(int i=0; i < data.length; i++){
if(i == data.length - 1){
sb.append(data[i]);
}else{
sb.append(data[i]);
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
}