package com.coding.basic.stack;
/**
* 用一个数组实现两个栈
* 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
* @author liuxin
*
*/
public class TwoStackInOneArray {
Object[] data = new Object[10];
int front;
int rear;
/**
* 向第一个栈中压入元素
* @param o
*/
public void push1(Object o){
checkInBound();
data[front++] = o;
}
/**
* 从第一个栈中弹出元素
* @return
*/
public Object pop1(){
checkOutBound(front);
Object o = data[--front];
data[front] = null;
return o;
}
/**
* 获取第一个栈的栈顶元素
* @return
*/
public Object peek1(){
checkOutBound(front);
return data[front-1];
}
/*
* 向第二个栈压入元素
*/
public void push2(Object o){
checkInBound();
data[data.length-rear-1] = o;
rear++;
}
/**
* 从第二个栈弹出元素
* @return
*/
public Object pop2(){
checkOutBound(rear);
int index = data.length-rear;
Object o = data[index];
data[index] = null;
rear--;
return o;
}
/**
* 获取第二个栈的栈顶元素
* @return
*/
public Object peek2(){
checkOutBound(rear);
return data[data.length-rear];
}
private Object[] resize(int len) {
int newLen = len * 2;
Object[] newData = new Object[newLen];
if(front > 0){
System.arraycopy(data, 0, newData, 0, front);
}
if(rear > 0){
System.arraycopy(data, len-rear, newData, newLen-rear, rear);
}
return newData;
}
private void checkOutBound(int index){
if(index <= 0){
throw new IndexOutOfBoundsException();
}
}
private void checkInBound() {
if((front+rear) >= data.length){
data = resize(data.length);
}
}
public static void main(String[] args) {
TwoStackInOneArray t = new TwoStackInOneArray();
for(int i=0;i<25;i++){
t.push1(i);
t.push2(i);
}
System.out.println(t.front+t.rear);
for(int i=0;i<t.data.length;i++){
System.out.print(t.data[i]+",");
}
}
}