一、什么是队列
队列和栈类似,只不过队列是先进先出,栈是先进后出,底层可以通过数组和链表实现,这里使用链表实现。
二、Java代码实现
package mypackage;
import java.util.Iterator;
//队列类,用链表实现
class Queue<T> implements Iterable<T>{
// 节点个数,头节点,尾节点
private int N;
private Node head;
private Node last;
//节点类
public class Node {
public T data;
public Node next;
public Node(T data, Node next) {
this.data = data;
this.next = next;
}
}
//构造方法,初始化
public Queue() {
this.N = 0;
this.head = new Node(null,null);
this.last = null;
}
//队列长度
public int size(){
return N;
}
//队列是否为空
public boolean isEmpty(){
return N==0;
}
//入队列
public void enqueue(T data){
// 如果队列为空,说明尾节点为空,让新节点为尾节点,头借点指向尾节点
if (isEmpty()){
last=new Node(data,null);
head.next=last;
// 如果队列不为空,让新节点为尾节点,老的尾节点指向新尾节点
}else {
Node oldlast=last;
last=new Node(data,null);
oldlast.next=last;
}
// 最后元素+1
N++;
}
//出队列,注意先入先出,每次出的节点就是head指向的第一个节点,然后让head只想第二个节点即可
// 且注意,如果队列为空,要将last=null
public T dequeue(){
// 如果为空,返回null
if (isEmpty()){
return null;
// 如果不为空,让head只想第二个节点,元素-1,且如果队列为空,要将last=null
}else {
Node oldfirst=head.next;
head.next=oldfirst.next;
N--;
if (isEmpty()){
last=null;
}
// 返回弹出的元素
return oldfirst.data;
}
}
// 遍历
@Override
public Iterator iterator() {
return new QIterator();
}
// 创建一个内部类实现Iterator接口
public class QIterator implements Iterator {
// 定义一个遍历的节点
private Node n;
public QIterator() {
// 初始化为0索引位置
this.n = head;
}
//重写两个方法
@Override
public boolean hasNext() {
// 这个方法判断是否超出最大索引,如果超出会停止遍历
return n.next != null;
}
@Override
public Object next() {
// 这个方法会遍历得每个节点
n = n.next;
return n.data;
}
}
}
//测试
public class MyJava {
public static void main(String[] args) {
//创建队列
Queue<Integer> queue=new Queue<>();
//入队列
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);
//元素个数
System.out.println("添加元素后元素个数:"+queue.size());
//遍历
System.out.print("遍历元素:");
for (Integer q:queue){
System.out.print(q+",");
}
System.out.println();
//出队列
System.out.println("弹出第1个元素:"+queue.dequeue());
System.out.println("弹出第2个元素:"+queue.dequeue());
System.out.println("弹出第3个元素:"+queue.dequeue());
System.out.println("弹出第4个元素:"+queue.dequeue());
System.out.println("弹出第5个元素:"+queue.dequeue());
System.out.println("弹出第6个元素:"+queue.dequeue());//返回null,因为没有第6个元素
//判断是否为空
System.out.println("弹出所有元素后队列是否空:"+queue.isEmpty());
}
}
结果: