/** * 用数组模拟栈 */ class ArrayStack { private int maxSize; private int[] stack; private int top = -1; public ArrayStack(int maxSize) { this.maxSize = maxSize; stack = new int[maxSize]; } public int getMaxSize() { return maxSize; } public boolean isFull() { return top == maxSize - 1; } public boolean isEmpty() { return top == -1; } /** * 从栈顶添加数据 */ public void push(int value) { if (isFull()) { throw new RuntimeException("栈满无法添加数据...."); } top++; stack[top] = value; } /** * 从栈顶弹出数据 */ public int pop() { if (isEmpty()) { throw new RuntimeException("栈空无法返回数据...."); } return stack[top--]; } /** * 从栈顶开始展示数据 */ public void list() { if (isEmpty()) { System.out.println("栈空无法展示数据...."); return; } //从数组末开始输出数据 for (int i = top;i >= 0; i--) { System.out.printf("stack[%d] = %d\n",i,stack[i]); } } }
存储数据的节点
class DataNode { //存储数据 public int data; public DataNode next; public DataNode pre; }
用于模拟栈的双向链表
class LinkedListStack { /** * 初始化双向链表的头节点,不存储任何数据 */ private DataNode headNode = new DataNode(-1); /** * 当前链表模拟的栈中存储数据的数量 */ private static int size = 0; /** * 在链表头添加数据模拟数据入栈 * @param num 添加的数据 */ public void push(int num) { //定义一个辅助指针指向头节点的下一个节点 DataNode temp = headNode.getNext(); //将要添加的数据封装成节点 DataNode dataNode = new DataNode(num); //头节点指向新的节点 headNode.setNext(dataNode); //新节点pre域指向头节点 dataNode.setPre(headNode); //防止出现空指针 //新的节点与temp指向的节点建立双向逻辑关系 if (temp != null) { temp.setPre(dataNode); } dataNode.setNext(temp); size++; } /** * 从表头取出数据模拟出栈 * @return * @throws Exception */ public int pop() throws Exception { if (isEmpty()) { throw new Exception("栈空无法返回数据...."); } //next不为空 DataNode next = headNode.getNext(); DataNode temp = next.next; int data = next.getData(); headNode.setNext(temp); if(temp != null) { temp.pre = headNode; } size--; return data; } public void list() throws Exception { if (isEmpty()) { throw new Exception("栈空无法展示数据...."); } DataNode temp = headNode.next; int index = size - 1; while (true) { if (temp == null) { break; } System.out.printf("stack[%d] = %d\n",index--,temp.getData()); temp = temp.getNext(); } } public boolean isEmpty() { return headNode.getNext() == null; } }
如有错误或不足欢迎评论指正。