队列

队列

队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性表,它按照先进先出的原则存储数据,先进入的数据,在读取数据时先读被读出来

队列的API设计

类名 Queue
构造方法 Queue() : 创建Queue对象
成员方法 1.public boolean isEmpty() : 判断队列是否为空,是返回true,否返回false
2.public int size() : 获取队列中元素的个数
3.public T dequeue() :从队列中拿出一个元素
4.public void enqueue(T t) : 往队列中插入一个元素
成员变量 1.private Node head :记录首结点
2.public int N : 记录当前栈的元素个数
3.private Node last : 记录最后一个结点

队列的实现

import java.util.Iterator;

public class Queue<T> implements Iterable<T>{
    //记录首结点
    private Node head;
    //记录最后一个结点
    private Node last;
    //记录队列中元素的个数
    private int N;



    //结点类
    private class Node{
        public T item;
        public Node next;

        public Node(T item,Node next) {
            this.item = item;
            this.next = next;
        }
    }
    public Queue() {
        //初始化队列
        this.head = new Node(null, null);
        this.N = 0;
        this.last = null;
    }
    //判断队列是否为空
    public boolean isEmpty(){
        return N==0;
    }

    //返回队列中元素的个数
    public int size(){
        return N;
    }

    //向队列中插入元素t
    public void enqueue(T t){
        //当前尾结点last 为null(当前队列为空,第一个插入进来的元素为尾结点)
        if (last==null){
            last = new Node(t,null);
            head.next = last;
        }else {
            //当前尾结点last不为null
            Node oldList = last;
            last = new Node(t,null);
            oldList.next = last;
        }
        //元素个数+1
        N++;
    }
    //从队列中拿出一个元素
    public T dequeue(){
        if (isEmpty()){
            return null;
        }
        Node oldFirst = head.next;
        head.next = oldFirst.next;
        N--;

        //因为出队列是删除元素,因此如果队列中的元素被删除完了,需要重置list = null;
        if (isEmpty()){
            last = null;
        }
        return oldFirst.item;
    }
    @Override
    public Iterator<T> iterator() {
        return new QIterator();
    }
    private class QIterator implements Iterator{
        private Node n;
        public QIterator(){
            this.n = head;
        }
        @Override
        public boolean hasNext() {
            return n.next!=null;
        }

        @Override
        public Object next() {
            n = n.next;
            return n.item;
        }
    }
}

测试代码:

import cn.linner.Queue;

public class QueueTest {
    public static void main(String[] args) {
        //创建队列对象
        Queue<String> q = new Queue<>();
        //测试队列的enqueue方法
        q.enqueue("a");
        q.enqueue("b");
        q.enqueue("c");
        q.enqueue("d");
        q.enqueue("e");
        q.enqueue("f");
        q.enqueue("g");
        for (String s : q) {
            System.out.println(s);
        }
        System.out.println("---------------------------------");
        //测试队列的dequeue方法
        String result = q.dequeue();
        System.out.println("出队列的元素是"+result);
        System.out.println("剩余的元素个数为: "+q.size());
    }
}
posted @ 2022-09-28 19:52  翀翀翀  阅读(5)  评论(0编辑  收藏  举报