双向链表模拟栈的实现
实现思路: 1、双向链表模拟栈 2、写一个实体类用来表示链表节点 3、入栈操作:将新的数据添加到链表末尾 4、出栈操作:将最后一个链表最后一个节点内容返回,并将前一个结点的后一个节点置为null。(一开始打算用单链表实现栈,但是在出栈时发现无法找到最后一个节点的前一个结点,所以用双向链表实现栈) 5、显示栈:链表打印时是正序打印,此时模拟栈的打印,栈的特点是先进后出,所以链表需要逆序打印 实现思路 (1)写一个方法计算出链表的长度 (2)将链表的节点存放在一个数组中 (3)逆序打印数组 大致思路如上,接下来开始写代码 实体类
class Data { private int no; private Data next; public Data prev; public Data(int no) { super(); this.no = no; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } public Data getNext() { return next; } public void setNext(Data next) { this.next = next; } public Data getPrev() { return prev; } public void setPrev(Data prev) { this.prev = prev; } @Override public String toString() { return "Data [no=" + no + "]"; } }
双向链表实现栈
class LinkedStack { private Data head = new Data(0); private int maxsize; public LinkedStack(int maxsize) { this.maxsize = maxsize; } // 判断栈是否为满 public boolean isFull() { return size() == maxsize; } // 判断栈是否为空 public boolean isEmpty() { return head.getNext() == null; } // 链表显示时是正序打印,栈显示时对于链表而言是逆序打印,这里写一个计算链表长度的方法用于逆序显示链表的内容 public int size() { if (head.getNext() == null) { return 0; } int size = 0; Data temp = head; while (temp.getNext() != null) { size++; temp = temp.getNext(); } return size; } // 显示栈 public void show() { if (isEmpty()) { System.out.println("栈为空"); return; } Data[] datas = new Data[size()]; Data temp = head.getNext(); for (int i = 0; i < size(); i++) { datas[i] = temp; temp = temp.getNext(); } for (int i = size() - 1; i >= 0; i--) { System.out.println(datas[i]); } } // 入栈 public void push(Data newData) { if (isFull()) { System.out.println("栈已满,无法添加数据"); return; } Data temp = head; while (temp.getNext() != null) { temp = temp.getNext(); } temp.setNext(newData); newData.setPrev(temp); } // 出栈 public Data pop() { if (isEmpty()) { throw new RuntimeException("栈为空,无法出栈"); } Data temp = head; while (temp.getNext() != null) { temp = temp.getNext(); } temp.getPrev().setNext(null); return temp; } // 查看栈顶的元素 public Data peek() { if (isEmpty()) { throw new RuntimeException("栈为空,栈顶无元素"); } Data temp = head; while (temp.getNext() != null) { temp = temp.getNext(); } return temp; } }
写一个主方法测试
public class LinkedStackDemo { public static void main(String[] args) { Data data1 = new Data(1); Data data2 = new Data(2); Data data3 = new Data(3); LinkedStack stack = new LinkedStack(3); stack.push(data1); stack.push(data2); stack.push(data3); stack.show(); System.out.println("栈顶的元素是"+stack.peek()); System.out.println("从栈顶取出的元素是"+stack.pop()); // System.out.println("从栈顶取出的元素是"+stack.pop()); System.out.println("取出栈顶的元素后栈内的元素:"); stack.show(); } }