一、用单链表实现栈
栈只允许在固定的一端(栈顶)进行插入(压栈)和删除(弹栈)元素操作
1、代码实现
2、测试
测试结果:
二、队列的实现和测试
队列允许在表的前端进行删除操作,而在表的后端进行插入操作
(先进先出,后进后出,上进下出)
1.代码实现
public class Queue<T> { //记录首结点 private Node head; //记录最后一个结点 private Node last; //记录队列中元素的个数 private int N; private class Node { public T item; public Node next; public Node(T item, Node next) { this.item = item; this.next = next; } } //构造为空 public Queue() { //首结点初始为空 this.head = new Node(null,null); this.last = null;//最后一个结点初始为null this.N = 0;//初始元素数量为0 } //判断队列是否为空 public boolean isEmpty() { return N == 0;//如果元素数量为0,则队列为空 } //返回队列中元素的个数 public int size() { return N;//返回当前元素数量 } public void enqueue(T t) { //保存当前的最后一个结点 Node oldLast = last; //创建新结点成为新的最后一个结点 last = new Node(t,null); //如果队列为空,则新结点作为首结点的下一个结点 if (isEmpty()) { head.next = last; } else { //否则,将旧的最后一个结点的next指向新结点 oldLast.next = last; } N ++; //元素个数加1 } //从队列中拿出一个元素 public T dequeue() { //如果队列为空,则返回null if (isEmpty()) { return null; } //如果队列不为空,保存当前的首结点 Node oldFirst = head.next; //更新首结点到下一个结点 head.next = oldFirst.next; //减少元素计数 N --; //因为出队列其实是在删除元素,因此如果队列中元素被删除完了,需要重置last为null if (isEmpty()) { last = null; } //返回取出的元素 return oldFirst.item; } }
2.测试:
测试结果: