Python 每日一记245>>>Java队列实现

一、什么是队列

队列和栈类似,只不过队列是先进先出,栈是先进后出,底层可以通过数组和链表实现,这里使用链表实现。

二、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());
    }
}

结果:
在这里插入图片描述

发布了235 篇原创文章 · 获赞 24 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_44663675/article/details/105629520
今日推荐