Java数据结构与算法之Queue队列

目录:
1.队列概述
2.队列分类
3.数组实现自定义队列
4.链表实现自定义队列

1.队列概述
队列是一种特殊的线性表,它可以通过数组与链表两种方式实现,它与单链表和数组的区别是它只能从队尾添加元素,
队首删除元素,同时满足先进先出(IFIO)的原则。


2.队列分类
Java数据结构与算法之Queue队列_第1张图片
3.数组实现自定义队列
(1)自定义队列接口CustomQueue.java
package com.datastructure.test;
/*
 * 自定义的队列接口,定义队列需要实现的方法,提供给类继承实现
 */
public interface CustomQueue {
	//入队函数,实现队列添加元素
	public void put(T data)throws Exception;
	//出队函数,实现队列元素删除
	public T remove()throws Exception;
	//判断是否队列为空
	public boolean isEmpty();
	//获取队列的长度
	public int size();
	//获取队列队头元素
	public T getFrontElement()throws Exception;
}

(2)数组实现对列自定义类CustomArrayQueue.java
package com.datastructure.test;


public class CustomArrayQueue implements CustomQueue {
	//默认队列长度
	static final int defaultSize = 15;
	//队列元素集合
	private T[] queueVals;
	//队列长度
	private int size;
	//队列第一个对象的位置
	private int front;
	//队列当前对象的位置
	private int rear;
	/*
	 * 默认构造方法,设置默认队列长度为15
	 */
	@SuppressWarnings("unchecked")
	public CustomArrayQueue (){
		front=rear=0;
		size = 0;
		queueVals = (T[]) new Object[defaultSize];
	}
	/*
	 * 带参构造方法,队列长度可自定义
	 */
	@SuppressWarnings("unchecked")
	public CustomArrayQueue (int defineSize){
		front=rear=0;
		size = 0;
		queueVals = (T[]) new Object[defineSize];
	}
	/*
	 * 添加对象到队列中
	 */
	@Override
	public void put(T data) throws Exception {
		if (size>0 && front==rear) {
			throw new Exception("队列已经满辣!");
		}else {
			queueVals[rear] = data;
			rear =(rear+1)%(queueVals.length);
			size++;
		}
	}
	/*
	 * 从队列中队首元素
	 */
	@Override
	public T remove() throws Exception {
		T object = null;
		if (isEmpty()) {
			throw new RuntimeException("队列什么也没有啦!");
		}else {
			//获取队首对象元素
		    object = queueVals[front];
		    //将队首元素置为null
		    queueVals[front] = null;
			front =(front+1)%(queueVals.length);
			size--;
			
		}
		return object;
	}
	/*
	 * 判断队列是否为空
	 */
	@Override
	public boolean isEmpty() {
		return size==0;
	}
	/*
	 * 获取队列长度
	 */
	@Override
	public int size() {
		return size;
	}
	/*
	 * 获取队列队首元素
	 */
	@Override
	public T getFrontElement() throws Exception {
		if (isEmpty()) {
			throw new RuntimeException("队列什么也没有啦!");
		}else {
			return queueVals[front];
		}
	}


}

(3)测试类
package com.datastructure.test;


public class ArrayQueueTest {


	public static void main(String[] args) {
		CustomArrayQueue queue = new CustomArrayQueue(10);
		try {
			System.out.println("队列是否为空:"+queue.isEmpty());
			queue.put("A");
			queue.put("B");
			queue.put("C");
			queue.put("D");
			queue.put("E");
			System.out.println("队首元素为:"+queue.getFrontElement());
			System.out.println("队列长度:"+queue.size());
			System.out.print("移除元素:");
			while (!queue.isEmpty()) {
				System.out.print(queue.remove()+"  ");
				
			}
			System.out.println();
			System.out.println("队列长度:"+queue.size());


			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


}

(4)控制台打印输出
队列是否为空:true
队首元素为:A
队列长度:5
移除元素:A  B  C  D  E  
队列长度:0

4.链表实现自定义队列

(1)自定义队列接口(与3一致)


(2)链表自定义队列类
package com.datastructure.test;


public class CustomLinkedQueue implements CustomQueue {
	private Node front;
	private Node rear;
	private int size;
	
	public CustomLinkedQueue(){
		//初始化时设置首尾节点都为空
		front = rear =null;
		//初始化节点数为0
		size = 0;
	}
	/*
	 * 添加新节点到尾部
	 */
	@Override
	public void put(T data) throws Exception {
		Node newNode = new Node(data, null);
		if (isEmpty()) {
			front = newNode;
			//将新节点设置为尾节点
			rear = newNode;
		}else {
			//尾节点后面添加新节点
			rear.nextNode = newNode;
			//将新节点设置为尾节点
			rear = newNode;
			
		}
		size++;
	}
	/*
	 * 移除队首元素
	 */
	@Override
	public T remove() throws Exception {
		T object = null;
		if (isEmpty()) {
			throw new RuntimeException("队列是空的哟!");
		}else {
			//保存队首元素值
			object = front.data;
			//将下一节点设置为队首节点
			front =front.nextNode;
		}
		size--;
		return object;
	}
	/*
	 * 判断队列是否为空
	 */
	@Override
	public boolean isEmpty() {
		return size==0;
	}
	/*
	 * 返回队列的长度
	 */
	@Override
	public int size() {


		return size;
	}
	/*
	 * 返回队列首节点数据
	 */
	@Override
	public T getFrontElement() throws Exception {
		
		return front.data;
	}
	/**
	 * 节点内部类
	 */
	class Node {
		T data;
		Node nextNode;
		/*
		 * 头节点构造方法
		 */
		public Node(Node nextNode){
			this.nextNode =nextNode;
		}
		/*
		 * 其他节点构造方法
		 */
		public Node(T data,Node nextNode){
			this.data=data;
			this.nextNode =nextNode;
		}
	}


}

(3)测试类

package com.datastructure.test;


public class LinkedQueueTest {


	public static void main(String[] args) {
		CustomLinkedQueue queue = new CustomLinkedQueue();
		try {
			System.out.println("队列是否为空:"+queue.isEmpty());
			queue.put("A");
			queue.put("B");
			queue.put("C");
			queue.put("D");
			queue.put("E");
			System.out.println("队首元素为:"+queue.getFrontElement());
			System.out.println("队列长度:"+queue.size());
			System.out.print("移除元素:");
			while (!queue.isEmpty()) {
				System.out.print(queue.remove()+"  ");
				
			}
			System.out.println();
			System.out.println("队列长度:"+queue.size());


			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


}

(4)控制台打印输出
队列是否为空:true
队首元素为:A
队列长度:5
移除元素:A  B  C  D  E  
队列长度:0

文章:

Java数据结构与算法之学习路线

Java数据结构与算法之Array数组

Java数据结构与算法之LinkedList单链表



Java数据结构与算法之Queue队列

Java数据结构与算法之stack栈




你可能感兴趣的:(JAVA)