您的位置:首页 > 理论基础 > 数据结构算法

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

2016-10-04 15:57 399 查看
目录:
1.队列概述
2.队列分类
3.数组实现自定义队列
4.链表实现自定义队列

1.队列概述
队列是一种特殊的线性表,它可以通过数组与链表两种方式实现,它与单链表和数组的区别是它只能从队尾添加元素,

队首删除元素,同时满足先进先出(IFIO)的原则。

2.队列分类



3.数组实现自定义队列
(1)自定义队列接口CustomQueue.java
package com.datastructure.test;
/*
* 自定义的队列接口,定义队列需要实现的方法,提供给类继承实现
*/
public interface CustomQueue<T> {
//入队函数,实现队列添加元素
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<T> implements CustomQueue<T> {
//默认队列长度
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<String> queue = new CustomArrayQueue<String>(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<T> implements CustomQueue<T> {
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<String> queue = new CustomLinkedQueue<String>();
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栈

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息