package com.coding.basic.stack;
/**
* 用一个数组实现两个栈,与循环队列类似,但相遇条件不同
* 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
* @author kai
*
*/
public class TwoStackInOneArray {
Object[] data = new Object[10];
private int p1 = 0;
private int p2 = data.length-1;
/**
* 向第一个栈中压入元素
* @param o
*/
public void push1(Object o){
if(p1 == p2){
data = grow(data, 10 , p2);
p2 += 10;
}
data[p1++] = o;
}
/**
* 从第一个栈中弹出元素
* @return
*/
public Object pop1(){
if(p1 <= 0){
throw new RuntimeException("Stack1 is empty!");
}
p1--;
Object result1 = data[p1];
data[p1] = null;
return result1;
}
/**
* 获取第一个栈的栈顶元素
* @return
*/
public Object peek1(){
if(p1 <= 0){
throw new RuntimeException("Stack1 is empty!");
}
p1--;
Object result1 = data[p1];
p1++;
return result1;
}
/*
* 向第二个栈压入元素
*/
public void push2(Object o){
if(p1 == p2){
data = grow(data, 10 , p2);
p2+=10;
}
data[p2--] = o;
}
/**
* 从第二个栈弹出元素
* @return
*/
public Object pop2(){
if(p2 >= data.length-1){
throw new RuntimeException("Stack1 is empty!");
}
p2++;
Object result2 = data[p2];
data[p2] = null;
return result2;
}
/**
* 获取第二个栈的栈顶元素
* @return
*/
public Object peek2(){
if(p2 >= data.length-1){
throw new RuntimeException("Stack1 is empty!");
}
p2++;
Object result2 = data[p2];
p2--;
return result2;
}
/*
* 扩容:
* 1.从p1与p2之间扩容,而不是直接在数组结束处扩容
* 2.扩容之后,p2相应扩大size
*
*/
public static Object[] grow(Object[] src, int size, int p2){
Object[] target = new Object[src.length + size];
System.arraycopy(src, 0, target, 0, p2);
System.arraycopy(src, p2,target, p2+size, src.length-p2);
return target;
}
public static void main(String[] args){
TwoStackInOneArray stack = new TwoStackInOneArray();
stack.push1(1);
stack.push1(2);
stack.push1(3);
stack.push1(4);
stack.push1(5);
stack.push1(6);
stack.push1(7);
stack.push1(8);
stack.push1(9);
stack.push2(9);
stack.push2(8);
stack.push2(7);
stack.push2(6);
stack.push2(5);
stack.push2(4);
stack.push2(3);
stack.push2(2);
stack.push2(1);
System.out.println(stack.peek1());
System.out.println(stack.pop1());
System.out.println(stack.pop1());
System.out.println(stack.pop1());
System.out.println("============");
System.out.println(stack.peek2());
System.out.println(stack.pop2());
System.out.println(stack.pop2());
System.out.println(stack.pop2());
}
}