package com.github.orajavac.coding2017.basic.stack; /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 * @author liuxin * */ public class TwoStackInOneArray { Object[] data = new Object[10]; //栈顶指针1 private int front = 0; //栈顶指针2 private int rear = data.length-1; /** * 向第一个栈中压入元素 * @param o */ public void push1(Object o){ if (data[front] == null){ data[front] = o; front++; }else{ grow(data,10); data[front] = o; front++; } } /** * 从第一个栈中弹出元素 * @return */ public Object pop1(){ Object o = null; if (front !=0 ){ front--; o = data[front]; data[front] = null; }else{ throw new RuntimeException("栈底已经没有元素了"); } return o; } /** * 获取第一个栈的栈顶元素 * @return */ public Object peek1(){ return data[front-1]; } /* * 向第二个栈压入元素 */ public void push2(Object o){ if (data[rear] == null){ data[rear] = o; rear--; }else{ grow(data,10); data[rear] = o; rear--; } } /** * 从第二个栈弹出元素 * @return */ public Object pop2(){ Object o = null; if (rear !=data.length-1 ){ rear++; o = data[rear]; data[rear] = null; }else{ throw new RuntimeException("栈底已经没有元素了"); } return o; } /** * 获取第二个栈的栈顶元素 * @return */ public Object peek2(){ return data[rear+1]; } public void grow(Object[] elementData,int size){ Object[] target = new Object[size+elementData.length]; int n = target.length; int m = 0; for (int i=0;i<front;i++){ target[i]=elementData[i]; m = i; //5 } System.out.println("m = "+m); for (int j=elementData.length-1;j>rear;j--){ n--; target[n]=elementData[j]; } n--; //在这里 n-- m++ 是因为在 push1 push2 时候,先push进去,再++的 rear=n; m++; front=m; this.data=target; } public void iteration(){ for (int i=0;i<data.length;i++){ System.out.print(data[i]+","); } System.out.println(); } }