package com.github.HarryHook.coding2017.stack; import java.util.Arrays; /** * 用一个数组实现两个栈 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 * * @author HarryHook * */ public class TwoStackInOneArray { Object[] data = new Object[6]; int i = 0; int j = data.length - 1; /** * 向第一个栈中压入元素 * * @param o */ public void push1(Object o) { if (i > j) { expansion(); } data[i++] = o; } /** * 从第一个栈中弹出元素 * * @return */ public Object pop1() { if (data[0] == null) { throw new RuntimeException("stack1 is empty"); } Object tmp = data[i - 1]; data[--i] = null; return tmp; } /** * 获取第一个栈的栈顶元素 * * @return */ public Object peek1() { return data[i - 1]; } /* * 向第二个栈压入元素 */ public void push2(Object o) { if (i > j) { expansion(); } data[j--] = o; } /** * 从第二个栈弹出元素 * * @return */ public Object pop2() { if (data[data.length - 1] == null) { throw new RuntimeException("stack2 is empty"); } Object tmp = data[j + 1]; data[++j] = null; return tmp; } /** * 获取第二个栈的栈顶元素 * * @return */ public Object peek2() { return data[j + 1]; } // 给数组扩容 public void expansion() { int oldCapacity = data.length; int newCapacity = oldCapacity * 2; // 此时扩容是因为数组有可能全是stack2的元素 data = Arrays.copyOf(data, newCapacity); int newIndex = newCapacity - 1; for (int k = oldCapacity - 1; k > j; k--) { data[newIndex--] = data[k]; data[k] = null; } j += newCapacity - oldCapacity; } public static void main(String[] args) { TwoStackInOneArray stack = new TwoStackInOneArray(); stack.push1(3); stack.push1(5); stack.push1(6); stack.push1(11); System.out.println("peek1: " + stack.peek1()); System.out.println("pop1: " + stack.pop1()); System.out.println("pop1: " + stack.pop1()); stack.push1(61); System.out.println("pop1: " + stack.pop1()); System.out.println("pop1: " + stack.pop1()); System.out.println("peek1: " + stack.peek1()); System.out.println("pop1: " + stack.pop1()); stack.push2(123); stack.push2(1); stack.push2(4); stack.push1(3); stack.push1(5); stack.push1(6); stack.push2(123); stack.push2(1); stack.push2(4); stack.push2(12); stack.push2(2); stack.push2(8); System.out.println("pop1: " + stack.pop1()); System.out.println("peek1: " + stack.peek1()); System.out.println("pop1: " + stack.pop1()); System.out.println("pop1: " + stack.pop1()); System.out.println("pop2: " + stack.pop2()); System.out.println("pop2: " + stack.pop2()); System.out.println("pop2: " + stack.pop2()); System.out.println("pop2: " + stack.pop2()); System.out.println("pop2: " + stack.pop2()); System.out.println("pop2: " + stack.pop2()); System.out.println("pop2: " + stack.pop2()); System.out.println("pop2: " + stack.pop2()); System.out.println("pop2: " + stack.pop2()); } }