在数组中,若知道数据项的下标,便可立即访问该数据项,或者通过顺序搜索数据项,访问到数组中的各个数据项。
但是栈和队列不同,它们的访问是受限制的,即在特定时刻只有一个数据项可以被读取或者被删除

队列是先进先出,只能访问头部数据

队列也可以用数组来实现,不过这里有个问题,当数组下标满了后就不能再添加了,但是数组前面由于已经删除队列头的数据了,导致空。所以队列我们可以用循环数组来实现,见下面的代码:

下面用数组来实现的基本操作代码

/**
 * 数组实现一个队列
 *     队列是先进先出,只能访问头部数据
 */
public class ArrayQueue {
    private long[] a;
    private int size;//数组大小
    private int nIteams;//实际存储数量:记录队列中有多少值  删除就-- 添加就++
    private int front;//头:主要是删除的时候记录,删除到哪里了
    private int rear;//尾:主要是添加的时候记录,添加到哪里了

    public ArrayQueue(int maxSize){
        this.size = maxSize;
        a = new long[size];
        front = 0;
        nIteams = 0;
        rear = -1;
    }

    //添加一个
    public void add(long value){
        if(isFull()){
            System.out.println("队列已经满了");
            return;
        }
        rear = ++rear % size;//
        a[rear] = value;//尾指针满了就循环到0处,这句相当于下面注释内容
        nIteams ++;
        /*
        if(rear == size-1){
            rear = -1;
        }
        a[++rear] = value;
        */
    }

    //删除一个
    public long remove(){
        if(isEmpty()){
            System.out.println("队列为空");
            return 0;
        }
        nIteams --;
        front = front % size;
        return a[front++];//去出来一个头部就减少一个 头就添加1
    }

    //查看第一个
    public long peek(){
        if(isEmpty()){
            System.out.println("队列为空");
            return 0;
        }
        return a[front];
    }

    public void display(){
        /*if(isEmpty()){
            System.out.println("队列为空");
            return;
        }*/
        System.out.print("[");
        int item = front;
        for (int i = 0; i < nIteams; i++) {
            System.out.print(a[item++ % size]);
            if(i != nIteams-1){
                System.out.print(",");
            }
        }
        System.out.println("]");
    }

    //是否满了
    public boolean isFull(){
        return (nIteams == size);
    }

    //是否为空
    public boolean isEmpty(){
        return (nIteams == 0);
    }

    //队列的大小
    public int size(){
        return nIteams;
    }
}

测试代码:

import java.util.PriorityQueue;
import java.util.Queue;

public class QueueDemo {
    public static void main(String[] args) {
        //测试真实队列
        /*Queue queue = new PriorityQueue();
        System.out.println(queue.size());
        System.out.println(queue);
        queue.add(1);
        queue.add(2);
        queue.add(3);
        System.out.println(queue);
        System.out.println(queue.size());
        queue.remove();
        System.out.println(queue);
        System.out.println(queue.peek());
        System.out.println(queue);*/

        //测试自己的队列
        ArrayQueue queue = new ArrayQueue(5);
        queue.display();
        System.out.println(queue.size());
        System.out.println(queue.isEmpty());
        queue.add(1);
        queue.add(2);
        queue.add(3);
        System.out.println(queue.size());
        queue.display();
        queue.remove();
        queue.display();
        System.out.println(queue.peek());
    }
}

总结:
和栈一样,队列中插入数据项和删除数据项的时间复杂度均为O(1)。

优先级队列:

还有个优先级队列,优先级队列是比栈和队列更专用的数据结构。优先级队列与上面普通的队列相比,主要区别在于队列中的元素是有序的,关键字最小(或者最大)的数据项总在队头。数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序。优先级队列的内部实现可以用数组或者一种特别的树——堆来实现。