版权声明:转载请注明出处: https://blog.csdn.net/qq_34774655/article/details/85270015
通过学习自定义链表,了解链表的数据结构。
本篇以链表的方式实现队列。(参看数组队列 ,以及 循环队列)
首先写一个队列的接口,描述其具有的基本功能。参看 自定义队列:Queue.java
然后写一个接口的实现类,这只是其中一种实现方式。LinkedListQueue.java
最后写一个测试类,测试自定义队列的效果。Test.java
LinkedListQueue.java:
package Queue;
public class LinkedListQueue <E> implements Queue<E>{
/**
* 维护的一个内部类,描述节点信息
* @author Xiaohua
*
*/
private class Node{
public E e;//数据域
public Node next;//指针域
public Node(E e, Node next) {
this.e=e;
this.next=next;
}
public Node(E e) {
this(e,null);
}
public Node() {
this(null,null);
}
@Override
public String toString() {
return e.toString();
}
}
private Node head;//指向头结点
private int size;//链表大小
private Node tail;//指向尾节点
/**
* 无参构造函数
*/
public LinkedListQueue(){
head = null;
tail = null;
size = 0;
}
/**
* 返回队列的大小
*/
@Override
public int getSize() {
return size;
}
/**
* 判断队列是否为空
*/
@Override
public boolean isEmpty() {
return size==0;
}
/**
* 插入队尾
*/
@Override
public void enqueue(E e) {
if(tail==null) {//此时为空
tail=new Node(e);
head=tail;
}
else {
tail.next =new Node(e);
tail=tail.next;
}
size++;
}
/**
* 取出队头
*/
@Override
public E dequeue() {
if(isEmpty()) {
throw new IllegalArgumentException("空队列,无法取出队头元素");
}
Node retNode = head;
head = head.next;
retNode.next = null;
if(head == null)
tail = null;
size --;
return retNode.e;
}
/**
* 查看队头
*/
@Override
public E getFront() {
if(isEmpty()) {
throw new IllegalArgumentException("空队列,无法查看队头元素");
}
return head.e;
}
/**
* 重写Object的toString方法
*/
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("Queue: front ");
Node cur = head;
while(cur != null) {
res.append(cur + "->");
cur = cur.next;
}
res.append("NULL tail");
return res.toString();
}
}
Test.java:
package Queue;
public class Test {
public static void main(String[] args) {
Queue<Integer> queue=new LinkedListQueue<Integer>();
for(int i=0;i<10;i++) {
queue.enqueue(i);
System.out.println(queue);
if(i%3==2) {//每插入3个,则取出队头元素。
queue.dequeue();
System.out.println(queue);
}
}
}
}
控制台输出;