美文网首页
数据结构之队列

数据结构之队列

作者: david161 | 来源:发表于2022-04-30 22:20 被阅读0次

队列(queue)是一种线性数据结构,队列中的元素只能先入先出(First In First Out,简称 FIFO)。
队列的出口端叫作队头(front),队列的入口端叫作队尾(rear)。

存储原理

队列这种数据结构既可以用数组来实现,也可以用链表来实现
1)数组实现


image.png

用数组实现时,为了入队操作的方便,把队尾位置规定为最后入队元素的下一个位置
用数组实现的队列叫作顺序队列
2)链表实现


image.png
用链表实现的队列叫作链式队列

操作

1)入队
入队(enqueue)就是把新元素放入队列中,只允许在队尾的位置放入元素,新元素的下一个位置将会成为新的队尾。


image.png

2)出队
出队操作(dequeue)就是把元素移出队列,只允许在队头一侧移出元素,出队元素的后一个元素将会成为新的队头。


image.png

完整代码

数组实现

package com.david.line.queue;

/**
* 用数组实现的队列
*/
public class ArrayQueue {
    // 数组:items,数组大小:n
    int[] nums;
    // head表示队头下标,tail表示队尾下标
    int head = 0;
    int tail = 0;

    //申请一个大小为capacity的数组
    public ArrayQueue(int size) {
        nums = new int[size];
    }

    //入队
    public boolean enqueue(int n) {
        // 如果tail == n 表示队列已经满了
        if (tail == nums.length) return false;
        nums[tail] = n;
        ++tail;
        return true;
    }

    //出队
    public int dequeue() {
        // 如果head == tail表示队列为空
        if (head == tail) return 0;

        int ret = nums[head];
        ++head;
        return ret;
    }

    public static void main(String[] args) {
        ArrayQueue aq = new ArrayQueue(8);
        aq.enqueue(3);
        aq.enqueue(5);
        aq.enqueue(1);
        aq.enqueue(4);

        System.out.println(aq.dequeue());
        System.out.println(aq.dequeue());
        System.out.println(aq.dequeue());
        System.out.println(aq.dequeue());
    }
}

链表实现

package com.david.line.queue;

import com.david.line.queue.Node;

/**
* 链表实现
*/
public class LinkedQueue {
    Node head;
    Node tail;
    int size;

    public void enqueue(Node node) {
        if (tail == null) {
            head = node;
            tail = node;
        } else {
            tail.next = node;
            tail = node;
        }
        size++;
    }

    public Node dequeue() {
        if (head == null) return null;
        Node h = head;
        //将拉取的节点的下一个节点变成新的表头
        head = head.next;
        //把旧的表头的下一个节点指向设置为null,让gc回收
        h.next = null;
        //队列为空
        if (head == null) {
            tail = null;
        }

        size--;
        return n;
    }

    public static void main(String[] args) {
        Node n1 = new Node(3);
        Node n2 = new Node(5);
        Node n3 = new Node(1);
        Node n4 = new Node(4);

        LinkedQueue lq = new LinkedQueue();
        lq.enqueue(n1);
        lq.enqueue(n2);
        lq.enqueue(n3);
        lq.enqueue(n4);

        System.out.println(lq.dequeue().value);
        System.out.println(lq.dequeue().value);
        System.out.println(lq.dequeue().value);
        System.out.println(lq.dequeue().value);
    }
}
时间复杂度

入队和出队都是O(1)

应用

资源池、消息队列、命令队列等等

相关文章

网友评论

      本文标题:数据结构之队列

      本文链接:https://www.haomeiwen.com/subject/kbrdyrtx.html