队列的创建-------用链表实现队列

一、相关概念

      ①、队列是一种线性集合,其元素从一端加入,另一端删除,是按照先进先出的方式处理(FIFO)

队列的创建-------用链表实现队列_第1张图片

   ②队列的相关操作

队列的创建-------用链表实现队列_第2张图片

③Java.util.stack类,提供了传统的push,pop,peek.    Java集合API对于队列只是提供Queue接口,由多个类(包括LinkedList类来实现)

二、链表实现队列思路

    ①自定义队列相关操作接口----队列ADT

    ②节点Node类----存储当前节点保存的element、当前节点的下个节点nextNode

    ③接口实现类

  •  队首索引
  •  队尾索引
  •  队列元素统计

三、代码实现

   ①QueueADT.java


/**
 * 
 * 

FileName:QueueADT.java

*

Descripton:队列接口:入队,出队,判断是否为空,队列大小.....

* @author zhonghl<23*****[email protected]> * @version 0.1 * @Data 2018-11-29 上午8:57:25 */ public interface QueueADT { /** * 入队 * @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

/**
 * 
 * 

FileName:Node.java

*

Descripton:

* @author zhonghl<231****[email protected]> * @version * @Data 2018-11-29 下午2:18:00 */ public class Node { private T element; private Node 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 getNextNode() { return nextNode; } public void setNextNode(Node nextNode) { this.nextNode = nextNode; } }

 ③LinkQueue.java

/**
 * 
 * 

FileName:LinkQueue.java

*

Descripton:QueueADT的实现类,链表实现队列

* @author zhonghl<231****[email protected]> * @version 0.1 * @Data 2018-11-29 上午10:08:28 */ public class LinkQueue implements QueueADT{ private Node head; private Node tail; private int count; public LinkQueue() { head=null; tail=null; count=0; } @Override public void enQueue(T element) { Node newNode=new Node(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 queue=new LinkQueue();
			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

测试结果:

队列的创建-------用链表实现队列_第3张图片

参考资料:《Java软件结构与数据结构》

你可能感兴趣的:(数据结构)