一、相关概念
①、队列是一种线性集合,其元素从一端加入,另一端删除,是按照先进先出的方式处理(FIFO)
②队列的相关操作
③Java.util.stack类,提供了传统的push,pop,peek. Java集合API对于队列只是提供Queue接口,由多个类(包括LinkedList类来实现)
二、链表实现队列思路
①自定义队列相关操作接口----队列ADT
②节点Node类----存储当前节点保存的element、当前节点的下个节点nextNode
③接口实现类
- 队首索引
- 队尾索引
- 队列元素统计
三、代码实现
①QueueADT.java
/**
*
* <p>FileName:QueueADT.java</p>
* <p>Descripton:队列接口:入队,出队,判断是否为空,队列大小.....</p>
* @author zhonghl<23*****500@qq.com>
* @version 0.1
* @Data 2018-11-29 上午8:57:25
*/
public interface QueueADT <T> {
/**
* 入队
* @param element
*/
public void enQueue(T element);
/**
* 出队
* @return
*/
public T deQueue()throws EmptyCollectionException;
/**
* 判断是否为空
* @return
*/
public boolean isEmpty();
/**
* 拿到队头
* @return
*/
public T first() throws EmptyCollectionException;
/**
* 队列大小
* @return
*/
public int size();
public String toString();
}
②Node.java
/**
*
* <p>FileName:Node.java</p>
* <p>Descripton:</p>
* @author zhonghl<231****500@qq.com>
* @version
* @Data 2018-11-29 下午2:18:00
*/
public class Node <T>{
private T element;
private Node<T> nextNode;
public Node() {
element = null;
nextNode=null;
}
public Node(T element) {
this.element = element;
}
public T getElement() {
return element;
}
public void setElement(T element) {
this.element = element;
}
public Node<T> getNextNode() {
return nextNode;
}
public void setNextNode(Node<T> nextNode) {
this.nextNode = nextNode;
}
}
③LinkQueue.java
/**
*
* <p>FileName:LinkQueue.java</p>
* <p>Descripton:QueueADT的实现类,链表实现队列</p>
* @author zhonghl<231****500@qq.com>
* @version 0.1
* @Data 2018-11-29 上午10:08:28
*/
public class LinkQueue <T> implements QueueADT<T>{
private Node<T> head;
private Node<T> tail;
private int count;
public LinkQueue() {
head=null;
tail=null;
count=0;
}
@Override
public void enQueue(T element) {
Node<T> newNode=new Node<T>(element);
if(isEmpty()){
//当添加第一个时,该元素既是队头有是队尾
head=newNode;
tail=newNode;
}else{
//新添加的元素放到队尾
tail.setNextNode(newNode);
tail=newNode;
}
count++;
}
@Override
public T deQueue() throws EmptyCollectionException {
if(isEmpty()){
throw new EmptyCollectionException("queue");
}
//出队:从队头取元素
T deQueue=head.getElement();
head=head.getNextNode();
count--;
if(isEmpty()){
//取的是最后一个,应把队尾设置为空
tail=null;
}
return deQueue;
}
@Override
public boolean isEmpty() {
if(count==0){
return true;
}
return false;
}
@Override
public int size() {
return count;
}
@Override
public T first() throws EmptyCollectionException {
if(isEmpty()){
throw new EmptyCollectionException("queue");
}
return head.getElement();
}
}
④异常类EmptyCollectionException :参考栈使用中的EmptyCollectionException的代码
https://blog.csdn.net/qq_39769369/article/details/83310283
⑤测试类 Main.java
public class Main {
/**
* 测试
* @param args
*/
public static void main(String[] args) {
try {
QueueADT<String> queue=new LinkQueue<String>();
System.out.println("**************");
System.out.println("队列的size:"+queue.size());
System.out.println("向队列添加1,2,3");
queue.enQueue("1");
queue.enQueue("2");
queue.enQueue("3");
System.out.println("队列的size:"+queue.size());
System.out.println("取队首元素:"+queue.first());
System.out.print("开始弹出队列元素:");
int size=queue.size();
for(int i=0;i<size;i++){
System.out.print(queue.deQueue());
if(i==size-1){
System.out.println();
System.out.println("**************");
}else {
System.out.print(",");
}
}
//测试异常
//queue.first();
} catch (EmptyCollectionException e) {
e.printStackTrace();
}
}
}
测试结果:
参考资料:《Java软件结构与数据结构》