package org.xukai.coderising.stack;
import org.junit.Test;
/**
* 用一个数组实现两个栈
* 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
* @author liuxin
*
*/
public class TwoStackInOneArray {
Object[] data = new Object[5];
private int s1Pos = -1;
private int s2Pos = data.length;
/**
* 向第一个栈中压入元素
* @param o
*/
public void push1(Object o){
if (s1Pos == s2Pos) {
doubleCapcity(data, s1Pos, s2Pos);
}
s1Pos++;
data[s1Pos] = o;
}
private void doubleCapcity(Object[] data, int s1Pos, int s2Pos) {
Object[] newData = new Object[2 * data.length];
System.arraycopy(data, 0, newData, 0, s1Pos + 1);
System.arraycopy(data, s2Pos, newData, data.length + s2Pos, data.length - s2Pos);
this.s2Pos = data.length + s2Pos;
this.data = newData;
}
/**
* 从第一个栈中弹出元素
* @return
*/
public Object pop1(){
if (s1Pos > -1) {
Object o = data[s1Pos];
s1Pos--;
return o;
}
return null;
}
/**
* 获取第一个栈的栈顶元素
* @return
*/
public Object peek1(){
if (s1Pos > -1) {
return data[s1Pos];
}
return null;
}
/*
* 向第二个栈压入元素
*/
public void push2(Object o){
if (s1Pos == s2Pos - 1) {
doubleCapcity(data, s1Pos, s2Pos);
}
s2Pos--;
data[s2Pos] = o;
}
/**
* 从第二个栈弹出元素
* @return
*/
public Object pop2(){
if (s2Pos < data.length) {
Object o = data[s2Pos];
s2Pos++;
return o;
}
return null;
}
/**
* 获取第二个栈的栈顶元素
* @return
*/
public Object peek2(){
if (s2Pos < data.length) {
return data[s2Pos];
}
return null;
}
@Test
public void testTwoStackInOneArray(){
TwoStackInOneArray stack = new TwoStackInOneArray();
System.out.println(stack.peek1());
System.out.println(stack.peek2());
System.out.println(stack.pop1());
System.out.println(stack.pop2());
stack.push1(1);
stack.push1(2);
stack.push2(6);
stack.push2(5);
stack.push2(4);
stack.push2(3);
System.out.println(stack.pop1());
System.out.println(stack.pop1());
System.out.println(stack.pop1());
System.out.println(stack.pop1());
System.out.println(stack.pop2());
System.out.println(stack.pop2());
System.out.println(stack.pop2());
System.out.println(stack.pop2());
}
}