package com.coding.basic.stack;
import java.util.Arrays;
/**
* 用一个数组实现两个栈
* 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
* @author liuxin
*
*/
public class TwoStackInOneArray {
private Object[] data = new Object[10];
private int size;
private int top1, top2;
public TwoStackInOneArray(int n){
data = new Object[n];
size = n;
top1 = -1;
top2 = data.length;
}
/**
* 向第一个栈中压入元素
* @param o
*/
public void push1(Object o){
ensureCapacity();
data[++top1] = o;
}
/*
* 向第二个栈压入元素
*/
public void push2(Object o){
ensureCapacity();
data[--top2] = o;
}
public void ensureCapacity(){
if(top2-top1>1){
return;
} else{
Object[] newArray = new Object[data.length*2];
System.arraycopy(data, 0, newArray, 0, top1+1);
int stack2Size = data.length-top2;
int newTop2 = newArray.length-stack2Size;
System.arraycopy(data, top2, newArray, newTop2, stack2Size);
top2 = newTop2;
data = newArray;
}
}
/**
* 从第一个栈中弹出元素
* @return
*/
public Object pop1(){
if(top1 == -1){
throw new RuntimeException("Stack1 is empty");
}
Object o = data[top1];
data[top1] = null;
top1--;
return o;
}
/**
* 从第二个栈弹出元素
* @return
*/
public Object pop2(){
if(top2 == data.length){
throw new RuntimeException("Stack2 is empty");
}
Object o = data[top2];
data[top2] = null;
top2++;
return o;
}
/**
* 获取第一个栈的栈顶元素
* @return
*/
public Object peek1(){
if(top1 == -1){
throw new RuntimeException("Stack1 is empty");
}
return data[top1];
}
/**
* 获取第二个栈的栈顶元素
* @return
*/
public Object peek2(){
if(top2 == data.length){
throw new RuntimeException("Stack2 is empty");
}
return data[top2];
}
public Object[] stack1ToArray(){
return Arrays.copyOf(data, top1+1);
}
public Object[] stack2ToArray(){
int size = data.length-top2;
Object [] stack2Data = new Object[size];
int j=0;
for(int i=data.length-1; i>=top2 ;i--){
stack2Data[j++] = data[i];
}
return stack2Data;
}
}