package me.lzb.basic.stack; /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 */ public class TwoStackInOneArray { private final int growsize = 10; private Object[] data = new Object[growsize]; private int point1 = 0; private int point2 = data.length - 1; /** * 向第一个栈中压入元素 * * @param o */ public void push1(Object o) { grow(); data[point1] = o; point1 = point1 + 1; } /** * 从第一个栈中弹出元素 * * @return */ public Object pop1() { if (isEmpty1()) { throw new RuntimeException("stack1 is empty"); } Object o = data[point1 - 1]; point1 = point1 - 1; return o; } /** * 获取第一个栈的栈顶元素 * * @return */ public Object peek1() { if (isEmpty1()) { throw new RuntimeException("stack1 is empty"); } return data[point1 - 1]; } /* * 向第二个栈压入元素 */ public void push2(Object o) { grow(); data[point2] = o; point2 = point2 - 1; } /** * 从第二个栈弹出元素 * * @return */ public Object pop2() { if (isEmpty2()) { throw new RuntimeException("stack2 is empty"); } Object o = data[point2 + 1]; point2 = point2 + 1; return o; } /** * 获取第二个栈的栈顶元素 * * @return */ public Object peek2() { if (isEmpty2()) { throw new RuntimeException("stack2 is empty"); } return data[point2 + 1]; } public boolean isEmpty1() { return size1() <= 0; } public boolean isEmpty2() { return size2() <= 0; } public int size1() { return point1; } public int size2() { return data.length - 1 - point2; } private void grow() { if (point2 - point1 > 0) { return; } Object[] d = new Object[data.length + growsize]; System.arraycopy(data, 0, d, 0, size1()); System.arraycopy(data, point2 + 1, d, d.length - size2(), size2()); point2 = d.length - 1 - size2(); data = d; } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append("["); if (!isEmpty1()) { for (int i = 0; i < point1; i++) { if (i > 0) { sb.append(","); } sb.append(data[i].toString()); } } sb.append("]"); sb.append("|"); sb.append("["); if (!isEmpty2()) { for (int i = data.length - 1; i > point2; i--) { if (i < data.length - 1) { sb.append(","); } sb.append(data[i].toString()); } } sb.append("]"); return sb.toString(); } }