聊聊队列

admin 发表于:2020-11-17 01:25:36 阅读数:340

队列

队列是一个有序列表,可以用数组或是链表实现。你可以想象下10年前去火车站排队买票的场景,在同一个窗口排成长长的队,先来的先买,后来的只能站在最后面排队,不允许插队。先来的人先买票(先进先出),后来的后买票(后进后出)。

遵循先入先出的原则,即:先存入队列的数据,要先取出,后存入的要后取出。

示意图:

队列

队列最基本的两个操作:入队(enqueue),放一个数据到队列的尾部;出队(dequeue)从队列头部取一个元素。

顺序队列和链式队列

用数组实现的队列叫顺序队列,用链表实现的队列叫链式队列。

本篇文章我们先分析下基于数组实现的顺序队列:

队列的初始状态

队列有两个指针,一个是head指针,指向队头;一个是tail指针,指向队尾。

  • 队列的初始状态:

    head = 0;
    tail = 0;
    

    队列的大小为size,队列数组的第一个元素下标为0,最后一个元素的下标为size-1。

  • 入队 入队 当a,b入队之后,队列头指针head不变还是指向下标为0的位置,队列尾指针tail指向下标为2的位置,即下一个入队元素的位置,当tail == size 时表示队列已满。

  • 出队

出队 当a出队之后,队列头指针head向后移动一个位置,指向队列的第一个有值的元素,队列尾指针tail指向不变,当head == tail 时表示队列为空。

用代码实现上述队列的入队和出队过程。

public class ArrayQueue {

    private Integer[] items;

    private int size;

    private int head = 0;

    private int tail = 0;

    public ArrayQueue(int size) {
        this.size = size;
        items = new Integer[size];
    }

    /**
     * 入队列
     * @param item
     * @return
     */
    public boolean enqueue(int item) {
        // 判断队列是否已满
        if(tail == size) {
            return false;
        }
        items[tail] = item;
        tail++;
        return true;
    }

    /**
     * 出队列
     * @return
     */
    public Integer dequeue() {
        // 判断队列是否为空
        if(head == tail) {
            return null;
        }
        Integer item = items[head];
        head++;

        return item;
    }

    /**
     * 打印队列中所有元素
     */
    public void list() {
        for(Integer item : items) {
            System.out.println(item);
        }
    }
}

Barbara Middleton
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis porta eros lacus, nec ultricies elit blandit non. Suspendisse pellentesque mauris sit amet dolor blandit rutrum. Nunc in tempus turpis.
Like · Reply · 3 hrs

Sean Brown
Donec sollicitudin urna eget eros malesuada sagittis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam blandit nisl a nulla sagittis, a lobortis leo feugiat.
Like · Reply · 2 hrs

Vivamus quis semper metus, non tincidunt dolor. Vivamus in mi eu lorem cursus ullamcorper sit amet nec massa.
Morbi vitae diam et purus tincidunt porttitor vel vitae augue. Praesent malesuada metus sed pharetra euismod. Cras tellus odio, tincidunt iaculis diam non, porta aliquet tortor.

Kayli Eunice
Sed convallis scelerisque mauris, non pulvinar nunc mattis vel. Maecenas varius felis sit amet magna vestibulum euismod malesuada cursus libero. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus lacinia non nisl id feugiat.
Like · Reply · 2 hrs