package com.github.ipk2015.coding2017.basic.stack;
/**
* 用一个数组实现两个栈
* 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
* @author liuxin
*
*/
public class TwoStackInOneArray {
Object[] data = new Object[10];
private int pointer1 = 0;
private int pointer2 = 9;
/**
* 向第一个栈中压入元素
* @param o
*/
public void push1(Object o){
if(pointer1 == pointer2){
enlargeDataArray();
}
data[pointer1++] = o;
}
private void enlargeDataArray(){
Object[] newData = new Object[data.length+100];
for(int i = 0;i < pointer1;i++){
newData[i] = data[i];
}
for(int i = pointer2+1;i < data.length;i++){
newData[i+100] = data[i];
}
pointer2 += 100;
data = newData;
}
/**
* 从第一个栈中弹出元素
* @return
*/
public Object pop1(){
Object object = data[pointer1-1];
data[pointer1-1] = null;
pointer1--;
return object;
}
/**
* 获取第一个栈的栈顶元素
* @return
*/
public Object peek1(){
return data[pointer1-1];
}
/*
* 向第二个栈压入元素
*/
public void push2(Object o){
if(pointer1 == pointer2){
enlargeDataArray();
}
data[pointer2--] = o;
}
/**
* 从第二个栈弹出元素
* @return
*/
public Object pop2(){
Object object = data[pointer2+1];
data[pointer2+1] = null;
pointer2++;
return object;
}
/**
* 获取第二个栈的栈顶元素
* @return
*/
public Object peek2(){
return data[pointer2+1];
}
}