package com.coding.basic.stack;
/**
* 用一个数组实现两个栈
* 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
* @author liuxin
*
*/
public class TwoStackInOneArray {
Object[] data = new Object[10];
int top1=-1;
int top2=10;
/**
* 向第一个栈中压入元素
* @param o
*/
public void push1(Object o){
if (top1+1==top2) {
grow(data,top1,top2);
}
data[++top1]=o;
}
private void grow(Object[] data2,int top1, int top2) {
// TODO Auto-generated method stub
Object[] data=new Object[data2.length+data2.length/2];
System.arraycopy(data2,0,data,0,top1+1);
System.arraycopy(data2,top2,data,top2+data2.length/2,data2.length-top2+1);
this.top2=top2+data2.length/2;
this.data=data;
}
/**
* 从第一个栈中弹出元素
* @return
*/
public Object pop1(){
if (top1+1>0) {
return data[top1--];
}
return null;
}
/**
* 获取第一个栈的栈顶元素
* @return
*/
public Object peek1(){
if (top1+1>0) {
return data[top1];
}
return null;
}
/*
* 向第二个栈压入元素
*/
public void push2(Object o){
if (top1+1==top2) {
grow(data,top1,top2);
}
data[--top2]=o;
}
/**
* 从第二个栈弹出元素
* @return
*/
public Object pop2(){
if (top2<data.length) {
return data[top2++];
}
return null;
}
/**
* 获取第二个栈的栈顶元素
* @return
*/
public Object peek2(){
if (top2<data.length) {
return data[top2];
}
return null;
}
}